Kaydet (Commit) 32034b60 authored tarafından Daniel Rentz [dr]'s avatar Daniel Rentz [dr] Kaydeden (comit) Michael Meeks

dr78: #164376# oox import performance: step 2 - move every access to XCell

interface into SheetDataBuffer class, delay creation of array formulas and
table operations, let XCellRangeData::setDataArray() accept formula token
sequences in addition to plain values

Conflicts:
	sc/source/ui/unoobj/cellsuno.cxx
üst 191bf989
...@@ -1204,36 +1204,60 @@ static sal_Bool lcl_PutDataArray( ScDocShell& rDocShell, const ScRange& rRange, ...@@ -1204,36 +1204,60 @@ static sal_Bool lcl_PutDataArray( ScDocShell& rDocShell, const ScRange& rRange,
for (long nCol=0; nCol<nCols; nCol++) for (long nCol=0; nCol<nCols; nCol++)
{ {
const uno::Any& rElement = pColArr[nCol]; const uno::Any& rElement = pColArr[nCol];
uno::TypeClass eElemClass = rElement.getValueTypeClass(); switch( rElement.getValueTypeClass() )
if ( eElemClass == uno::TypeClass_VOID )
{ {
// void = "no value" case uno::TypeClass_VOID:
pDoc->SetError( nDocCol, nDocRow, nTab, NOTAVAILABLE ); {
} // void = "no value"
else if ( eElemClass == uno::TypeClass_BYTE || pDoc->SetError( nDocCol, nDocRow, nTab, NOTAVAILABLE );
eElemClass == uno::TypeClass_SHORT || }
eElemClass == uno::TypeClass_UNSIGNED_SHORT || break;
eElemClass == uno::TypeClass_LONG ||
eElemClass == uno::TypeClass_UNSIGNED_LONG || // #87871# accept integer types because Basic passes a floating point
eElemClass == uno::TypeClass_FLOAT ||
eElemClass == uno::TypeClass_DOUBLE )
{
// accept integer types because Basic passes a floating point
// variable as byte, short or long if it's an integer number. // variable as byte, short or long if it's an integer number.
double fVal(0.0); case uno::TypeClass_BYTE:
rElement >>= fVal; case uno::TypeClass_SHORT:
pDoc->SetValue( nDocCol, nDocRow, nTab, fVal ); case uno::TypeClass_UNSIGNED_SHORT:
} case uno::TypeClass_LONG:
else if ( eElemClass == uno::TypeClass_STRING ) case uno::TypeClass_UNSIGNED_LONG:
{ case uno::TypeClass_FLOAT:
rtl::OUString aUStr; case uno::TypeClass_DOUBLE:
rElement >>= aUStr; {
if ( !aUStr.isEmpty() ) double fVal(0.0);
pDoc->PutCell( nDocCol, nDocRow, nTab, new ScStringCell( aUStr ) ); rElement >>= fVal;
} pDoc->SetValue( nDocCol, nDocRow, nTab, fVal );
else }
bError = sal_True; // invalid type break;
case uno::TypeClass_STRING:
{
rtl::OUString aUStr;
rElement >>= aUStr;
if ( !aUStr.isEmpty() )
pDoc->PutCell( nDocCol, nDocRow, nTab, new ScStringCell( aUStr ) );
}
break;
// accept Sequence<FormulaToken> for formula cells
case uno::TypeClass_SEQUENCE:
{
uno::Sequence< sheet::FormulaToken > aTokens;
if ( rElement >>= aTokens )
{
ScTokenArray aTokenArray;
ScTokenConversion::ConvertToTokenArray( *pDoc, aTokenArray, aTokens );
ScAddress aPos( nDocCol, nDocRow, nTab );
ScBaseCell* pNewCell = new ScFormulaCell( pDoc, aPos, &aTokenArray );
pDoc->PutCell( aPos, pNewCell );
}
else
bError = true;
}
break;
default:
bError = true; // invalid type
}
++nDocCol; ++nDocCol;
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment