diff options
Diffstat (limited to 'sc/source/filter/oox/formulabuffer.cxx')
-rw-r--r-- | sc/source/filter/oox/formulabuffer.cxx | 59 |
1 files changed, 16 insertions, 43 deletions
diff --git a/sc/source/filter/oox/formulabuffer.cxx b/sc/source/filter/oox/formulabuffer.cxx index 4f4042c18fbb..5de935e7d451 100644 --- a/sc/source/filter/oox/formulabuffer.cxx +++ b/sc/source/filter/oox/formulabuffer.cxx @@ -47,20 +47,6 @@ FormulaBuffer::FormulaBuffer( const WorkbookHelper& rHelper ) : WorkbookHelper( { } -Reference<XCellRange> FormulaBuffer::getRange( const CellRangeAddress& rRange ) -{ - Reference<XCellRange> xRange; - try - { - xRange = mxCurrSheet->getCellRangeByPosition( - rRange.StartColumn, rRange.StartRow, rRange.EndColumn, rRange.EndRow); - } - catch( Exception& ) - { - } - return xRange; -} - void FormulaBuffer::finalizeImport() { ISegmentProgressBarRef xFormulaBar = getProgressBar().createSegment( getProgressBar().getFreeLength() ); @@ -239,40 +225,27 @@ void FormulaBuffer::applySharedFormulas( sal_Int32 nTab ) } } -// bound to need this somewhere else, if so probably need to move it to -// worksheethelper or somewhere else more suitable -void StartCellListening( sal_Int16 nSheet, sal_Int32 nRow, sal_Int32 nCol, ScDocument& rDoc ) -{ - ScAddress aCellPos; - CellAddress aAddress; - aAddress.Sheet = nSheet; - aAddress.Row = nRow; - aAddress.Column = nCol; - ScUnoConversion::FillScAddress( aCellPos, aAddress ); - ScFormulaCell* pFCell = rDoc.GetFormulaCell( aCellPos ); - if ( pFCell ) - pFCell->StartListeningTo( &rDoc ); -} - void FormulaBuffer::applyArrayFormulas( const std::vector< TokenRangeAddressItem >& rVector ) { ScDocument& rDoc = getScDocument(); - for ( std::vector< TokenRangeAddressItem >::const_iterator it = rVector.begin(), it_end = rVector.end(); it != it_end; ++it ) + std::vector<TokenRangeAddressItem>::const_iterator it = rVector.begin(), itEnd = rVector.end(); + for (; it != itEnd; ++it) { - Reference< XArrayFormulaTokens > xTokens( getRange( it->maCellRangeAddress ), UNO_QUERY ); - OSL_ENSURE( xTokens.is(), "SheetDataBuffer::finalizeArrayFormula - missing formula token interface" ); - ApiTokenSequence aTokens = getFormulaParser().importFormula( it->maTokenAndAddress.maCellAddress, it->maTokenAndAddress.maTokenStr ); - if( xTokens.is() ) + ScAddress aPos; + ScUnoConversion::FillScAddress(aPos, it->maTokenAndAddress.maCellAddress); + ScRange aRange; + ScUnoConversion::FillScRange(aRange, it->maCellRangeAddress); + + ScCompiler aComp(&rDoc, aPos); + aComp.SetGrammar(formula::FormulaGrammar::GRAM_ENGLISH_XL_OOX); + ScTokenArray* pArray = aComp.CompileString(it->maTokenAndAddress.maTokenStr); + if (pArray) { - xTokens->setArrayTokens( aTokens ); - // set dependencies, add listeners on the cells in array - for ( sal_Int32 nCol = it->maCellRangeAddress.StartColumn; nCol <= it->maCellRangeAddress.EndColumn; ++nCol ) - { - for ( sal_Int32 nRow = it->maCellRangeAddress.StartRow; nRow <= it->maCellRangeAddress.EndRow; ++nRow ) - { - StartCellListening( it->maCellRangeAddress.Sheet, nRow, nCol, rDoc ); - } - } + ScMarkData aMark; + aMark.SelectOneTable(aPos.Tab()); + rDoc.InsertMatrixFormula( + aRange.aStart.Col(), aRange.aStart.Row(), aRange.aEnd.Col(), aRange.aEnd.Row(), + aMark, it->maTokenAndAddress.maTokenStr, pArray, formula::FormulaGrammar::GRAM_ENGLISH_XL_OOX); } } } |