sc/source/filter/inc/formulabuffer.hxx | 13 ++-- sc/source/filter/oox/formulabuffer.cxx | 88 +++++++++++---------------------- 2 files changed, 37 insertions(+), 64 deletions(-)
New commits: commit 00adb9d393dd1f6dff6a6bd6e036d9e040fa37ee Author: Kohei Yoshida <libreoff...@kohei.us> Date: Sun Sep 8 19:51:57 2013 -0400 Import matrix formulas from xlsx without using UNO API. Change-Id: Ic13d08ad3a827ede0db73d8ba78b9cfa82c662e9 diff --git a/sc/source/filter/inc/formulabuffer.hxx b/sc/source/filter/inc/formulabuffer.hxx index 381a65a..e847c3cf8 100644 --- a/sc/source/filter/inc/formulabuffer.hxx +++ b/sc/source/filter/inc/formulabuffer.hxx @@ -94,9 +94,6 @@ class FormulaBuffer : public WorkbookHelper SheetToSharedIdToTokenIndex maTokenIndexes; FormulaValueMap maCellFormulaValues; - com::sun::star::uno::Reference<com::sun::star::table::XCellRange> - getRange( const com::sun::star::table::CellRangeAddress& rRange ); - void applyArrayFormulas( const std::vector< TokenRangeAddressItem >& rVector ); void applyCellFormula( ScDocument& rDoc, const ApiTokenSequence& rTokens, const ::com::sun::star::table::CellAddress& rAddress ); void applyCellFormulas( const std::vector< TokenAddressItem >& rVector ); diff --git a/sc/source/filter/oox/formulabuffer.cxx b/sc/source/filter/oox/formulabuffer.cxx index 4f4042c..5de935e 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); } } } commit ce29dbb48a5bc0b117528e0566888066b8dc6fb9 Author: Kohei Yoshida <libreoff...@kohei.us> Date: Sun Sep 8 19:00:12 2013 -0400 Make data member names consistent. Change-Id: Icd949d84bb7a575b0e4adbe5c1c6f4d30e9b5213 diff --git a/sc/source/filter/inc/formulabuffer.hxx b/sc/source/filter/inc/formulabuffer.hxx index c5d8f96..381a65a 100644 --- a/sc/source/filter/inc/formulabuffer.hxx +++ b/sc/source/filter/inc/formulabuffer.hxx @@ -86,14 +86,16 @@ class FormulaBuffer : public WorkbookHelper typedef ::std::pair< ::com::sun::star::table::CellAddress, double > ValueAddressPair; typedef ::std::map< sal_Int32, std::vector< ValueAddressPair > > FormulaValueMap; - ::com::sun::star::uno::Reference< com::sun::star::table::XCellRange > getRange( const ::com::sun::star::table::CellRangeAddress& rRange); com::sun::star::uno::Reference< com::sun::star::sheet::XSpreadsheet > mxCurrSheet; - FormulaDataMap cellFormulas; - ArrayFormulaDataMap cellArrayFormulas; - SheetToFormulaEntryMap sharedFormulas; - SheetToSharedFormulaid sharedFormulaIds; - SheetToSharedIdToTokenIndex tokenIndexes; - FormulaValueMap cellFormulaValues; + FormulaDataMap maCellFormulas; + ArrayFormulaDataMap maCellArrayFormulas; + SheetToFormulaEntryMap maSharedFormulas; + SheetToSharedFormulaid maSharedFormulaIds; + SheetToSharedIdToTokenIndex maTokenIndexes; + FormulaValueMap maCellFormulaValues; + + com::sun::star::uno::Reference<com::sun::star::table::XCellRange> + getRange( const com::sun::star::table::CellRangeAddress& rRange ); void applyArrayFormulas( const std::vector< TokenRangeAddressItem >& rVector ); void applyCellFormula( ScDocument& rDoc, const ApiTokenSequence& rTokens, const ::com::sun::star::table::CellAddress& rAddress ); diff --git a/sc/source/filter/oox/formulabuffer.cxx b/sc/source/filter/oox/formulabuffer.cxx index dce36d7..4f4042c 100644 --- a/sc/source/filter/oox/formulabuffer.cxx +++ b/sc/source/filter/oox/formulabuffer.cxx @@ -47,12 +47,13 @@ FormulaBuffer::FormulaBuffer( const WorkbookHelper& rHelper ) : WorkbookHelper( { } -Reference< XCellRange > FormulaBuffer::getRange( const CellRangeAddress& rRange) +Reference<XCellRange> FormulaBuffer::getRange( const CellRangeAddress& rRange ) { - Reference< XCellRange > xRange; + Reference<XCellRange> xRange; try { - xRange = mxCurrSheet->getCellRangeByPosition( rRange.StartColumn, rRange.StartRow, rRange.EndColumn, rRange.EndRow ); + xRange = mxCurrSheet->getCellRangeByPosition( + rRange.StartColumn, rRange.StartRow, rRange.EndColumn, rRange.EndRow); } catch( Exception& ) { @@ -75,20 +76,20 @@ void FormulaBuffer::finalizeImport() applySharedFormulas(nTab); - FormulaDataMap::iterator cellIt = cellFormulas.find( nTab ); - if ( cellIt != cellFormulas.end() ) + FormulaDataMap::iterator cellIt = maCellFormulas.find( nTab ); + if ( cellIt != maCellFormulas.end() ) { applyCellFormulas( cellIt->second ); } - ArrayFormulaDataMap::iterator itArray = cellArrayFormulas.find( nTab ); - if ( itArray != cellArrayFormulas.end() ) + ArrayFormulaDataMap::iterator itArray = maCellArrayFormulas.find( nTab ); + if ( itArray != maCellArrayFormulas.end() ) { applyArrayFormulas( itArray->second ); } - FormulaValueMap::iterator itValues = cellFormulaValues.find( nTab ); - if ( itValues != cellFormulaValues.end() ) + FormulaValueMap::iterator itValues = maCellFormulaValues.find( nTab ); + if ( itValues != maCellFormulaValues.end() ) { std::vector< ValueAddressPair > & rVector = itValues->second; applyCellFormulaValues( rVector ); @@ -140,13 +141,13 @@ void FormulaBuffer::applyCellFormulaValues( const std::vector< ValueAddressPair void FormulaBuffer::applySharedFormulas( sal_Int32 nTab ) { - SheetToFormulaEntryMap::const_iterator itShared = sharedFormulas.find(nTab); - if (itShared == sharedFormulas.end()) + SheetToFormulaEntryMap::const_iterator itShared = maSharedFormulas.find(nTab); + if (itShared == maSharedFormulas.end()) // There is no shared formulas for this sheet. return; - SheetToSharedFormulaid::const_iterator itCells = sharedFormulaIds.find(nTab); - if (itCells == sharedFormulaIds.end()) + SheetToSharedFormulaid::const_iterator itCells = maSharedFormulaIds.find(nTab); + if (itCells == maSharedFormulaIds.end()) // There is no formula cells that use shared formulas for this sheet. return; @@ -280,20 +281,20 @@ void FormulaBuffer::createSharedFormulaMapEntry( const table::CellAddress& rAddress, const table::CellRangeAddress& rRange, sal_Int32 nSharedId, const OUString& rTokens ) { - std::vector<SharedFormulaEntry>& rSharedFormulas = sharedFormulas[ rAddress.Sheet ]; + std::vector<SharedFormulaEntry>& rSharedFormulas = maSharedFormulas[ rAddress.Sheet ]; SharedFormulaEntry aEntry(rAddress, rRange, rTokens, nSharedId); rSharedFormulas.push_back( aEntry ); } void FormulaBuffer::setCellFormula( const ::com::sun::star::table::CellAddress& rAddress, const OUString& rTokenStr ) { - cellFormulas[ rAddress.Sheet ].push_back( TokenAddressItem( rTokenStr, rAddress ) ); + maCellFormulas[ rAddress.Sheet ].push_back( TokenAddressItem( rTokenStr, rAddress ) ); } void FormulaBuffer::setCellFormula( const table::CellAddress& rAddress, sal_Int32 nSharedId, const OUString& rCellValue, sal_Int32 nValueType ) { - sharedFormulaIds[rAddress.Sheet].push_back( + maSharedFormulaIds[rAddress.Sheet].push_back( SharedFormulaDesc(rAddress, nSharedId, rCellValue, nValueType)); } @@ -301,12 +302,12 @@ void FormulaBuffer::setCellArrayFormula( const ::com::sun::star::table::CellRang { TokenAddressItem tokenPair( rTokenStr, rTokenAddress ); - cellArrayFormulas[ rRangeAddress.Sheet ].push_back( TokenRangeAddressItem( tokenPair, rRangeAddress ) ); + maCellArrayFormulas[ rRangeAddress.Sheet ].push_back( TokenRangeAddressItem( tokenPair, rRangeAddress ) ); } void FormulaBuffer::setCellFormulaValue( const ::com::sun::star::table::CellAddress& rAddress, double fValue ) { - cellFormulaValues[ rAddress.Sheet ].push_back( ValueAddressPair( rAddress, fValue ) ); + maCellFormulaValues[ rAddress.Sheet ].push_back( ValueAddressPair( rAddress, fValue ) ); } }} _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits