sc/source/filter/inc/sheetdatabuffer.hxx | 14 +++++++++----- sc/source/filter/inc/worksheethelper.hxx | 2 +- sc/source/filter/oox/sheetdatabuffer.cxx | 19 ++++++++++++++----- sc/source/filter/oox/sheetdatacontext.cxx | 7 ++++++- 4 files changed, 30 insertions(+), 12 deletions(-)
New commits: commit 80817430ee98fad2e6ada52a52741ef9992f4a44 Author: Markus Mohrhard <markus.mohrh...@collabora.co.uk> Date: Wed Dec 24 04:11:08 2014 +0100 reimplement shared formula import for xlsb, fdo#86734 (cherry picked from commit e1351ed4c5f9152c80b32bbaa53e3eff56671331) Change-Id: Ic5d678a2b1197ce8d83b308b0a4387bf657052d5 diff --git a/sc/source/filter/inc/sheetdatabuffer.hxx b/sc/source/filter/inc/sheetdatabuffer.hxx index f84f91c..f8290bf 100644 --- a/sc/source/filter/inc/sheetdatabuffer.hxx +++ b/sc/source/filter/inc/sheetdatabuffer.hxx @@ -136,6 +136,10 @@ public: /** Inserts a ISO 8601 date cell into the sheet. */ void setDateCell( const CellModel& rModel, const OUString& rDateString ); + void createSharedFormula( + const com::sun::star::table::CellAddress& rRange, + const ApiTokenSequence& rTokens); + /** Inserts the passed token array as array formula. */ void createArrayFormula( const ::com::sun::star::table::CellRangeAddress& rRange, @@ -161,17 +165,17 @@ public: /** Final processing after the sheet has been imported. */ void finalizeImport(); -private: - struct XfIdRowRange; - /** Sets the passed formula token array into a cell. */ void setCellFormula( const ::com::sun::star::table::CellAddress& rCellAddr, const ApiTokenSequence& rTokens ); +private: + struct XfIdRowRange; + /** Creates a formula token array representing the shared formula with the passed identifier. */ - ApiTokenSequence resolveSharedFormula( const BinAddress& rMapKey ) const; + ApiTokenSequence resolveSharedFormula( const css::table::CellAddress& rMapKey ) const; /** Inserts the passed array formula into the sheet. */ void finalizeArrayFormula( @@ -244,7 +248,7 @@ private: SharedFormulaMap maSharedFormulas; /// Maps shared formula base address to defined name token index. ::com::sun::star::table::CellAddress maSharedFmlaAddr; /// Address of a cell containing a pending shared formula. - BinAddress maSharedBaseAddr; /// Base address of the pending shared formula. + css::table::CellAddress maSharedBaseAddr; /// Base address of the pending shared formula. XfIdRowRange maXfIdRowRange; /// Cached XF identifier for a range of rows. XfIdRangeListMap maXfIdRangeLists; /// Collected XF identifiers for cell rangelists. MergedRangeList maMergedRanges; /// Merged cell ranges. diff --git a/sc/source/filter/inc/worksheethelper.hxx b/sc/source/filter/inc/worksheethelper.hxx index a07019a..dbf1990 100644 --- a/sc/source/filter/inc/worksheethelper.hxx +++ b/sc/source/filter/inc/worksheethelper.hxx @@ -61,7 +61,7 @@ typedef ::std::map< OUString, void* > ExtLst; // ============================================================================ // ============================================================================ -typedef ::std::map< BinAddress, sal_Int32 > SharedFormulaMap; +typedef ::std::map< BinAddress, ApiTokenSequence > SharedFormulaMap; /** An enumeration for all types of sheets in a workbook. */ enum WorksheetType diff --git a/sc/source/filter/oox/sheetdatabuffer.cxx b/sc/source/filter/oox/sheetdatabuffer.cxx index 60987c9..98cf684 100644 --- a/sc/source/filter/oox/sheetdatabuffer.cxx +++ b/sc/source/filter/oox/sheetdatabuffer.cxx @@ -241,6 +241,14 @@ void SheetDataBuffer::setDateCell( const CellModel& rModel, const OUString& rDat setValueCell( rModel, fValue ); } +void SheetDataBuffer::createSharedFormula(const CellAddress& rAddr, const ApiTokenSequence& rTokens) +{ + BinAddress aAddr(rAddr); + maSharedFormulas[aAddr] = rTokens; + if( mbPendingSharedFmla ) + setCellFormula( maSharedFmlaAddr, resolveSharedFormula( maSharedBaseAddr ) ); +} + void SheetDataBuffer::setFormulaCell( const CellModel& rModel, const ApiTokenSequence& rTokens ) { mbPendingSharedFmla = false; @@ -270,11 +278,11 @@ void SheetDataBuffer::setFormulaCell( const CellModel& rModel, const ApiTokenSeq reading the formula definition it will be retried to insert the formula via retryPendingSharedFormulaCell(). */ BinAddress aBaseAddr( aTokenInfo.First ); - aTokens = resolveSharedFormula( aBaseAddr ); + aTokens = resolveSharedFormula( aTokenInfo.First ); if( !aTokens.hasElements() ) { maSharedFmlaAddr = rModel.maCellAddr; - maSharedBaseAddr = aBaseAddr; + maSharedBaseAddr = aTokenInfo.First; mbPendingSharedFmla = true; } } @@ -579,10 +587,11 @@ void SheetDataBuffer::setCellFormula( const CellAddress& rCellAddr, const ApiTok } } -ApiTokenSequence SheetDataBuffer::resolveSharedFormula( const BinAddress& rMapKey ) const +ApiTokenSequence SheetDataBuffer::resolveSharedFormula( const CellAddress& rAddr ) const { - sal_Int32 nTokenIndex = ContainerHelper::getMapElement( maSharedFormulas, rMapKey, -1 ); - return (nTokenIndex >= 0) ? getFormulaParser().convertNameToFormula( nTokenIndex ) : ApiTokenSequence(); + BinAddress aAddr(rAddr); + ApiTokenSequence aTokens = ContainerHelper::getMapElement( maSharedFormulas, aAddr, ApiTokenSequence() ); + return aTokens; } void SheetDataBuffer::finalizeArrayFormula( const CellRangeAddress& rRange, const ApiTokenSequence& rTokens ) const diff --git a/sc/source/filter/oox/sheetdatacontext.cxx b/sc/source/filter/oox/sheetdatacontext.cxx index bbda959..0778f22 100644 --- a/sc/source/filter/oox/sheetdatacontext.cxx +++ b/sc/source/filter/oox/sheetdatacontext.cxx @@ -566,8 +566,13 @@ void SheetDataContext::importDataTable( SequenceInputStream& rStrm ) } } -void SheetDataContext::importSharedFmla( SequenceInputStream& /*rStrm*/ ) +void SheetDataContext::importSharedFmla( SequenceInputStream& rStrm ) { + if( readFormulaRef( rStrm ) && maFmlaData.isValidSharedRef( maCellData.maCellAddr ) ) + { + ApiTokenSequence aTokens = mrFormulaParser.importFormula( maCellData.maCellAddr, FORMULATYPE_SHAREDFORMULA, rStrm ); + mrSheetData.createSharedFormula( maCellData.maCellAddr, aTokens ); + } } } // namespace xls _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits