diff options
-rw-r--r-- | sc/source/filter/inc/sheetdatabuffer.hxx | 14 | ||||
-rw-r--r-- | sc/source/filter/inc/worksheethelper.hxx | 2 | ||||
-rw-r--r-- | sc/source/filter/oox/sheetdatabuffer.cxx | 19 | ||||
-rw-r--r-- | sc/source/filter/oox/sheetdatacontext.cxx | 7 |
4 files changed, 30 insertions, 12 deletions
diff --git a/sc/source/filter/inc/sheetdatabuffer.hxx b/sc/source/filter/inc/sheetdatabuffer.hxx index c2e7550d4856..1c898142a726 100644 --- a/sc/source/filter/inc/sheetdatabuffer.hxx +++ b/sc/source/filter/inc/sheetdatabuffer.hxx @@ -125,6 +125,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, @@ -149,17 +153,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( @@ -231,7 +235,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 79ab96425ba7..a1bc389bf07a 100644 --- a/sc/source/filter/inc/worksheethelper.hxx +++ b/sc/source/filter/inc/worksheethelper.hxx @@ -59,7 +59,7 @@ class WorksheetSettings; 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 45c9fa9356db..3adfc5705287 100644 --- a/sc/source/filter/oox/sheetdatabuffer.cxx +++ b/sc/source/filter/oox/sheetdatabuffer.cxx @@ -220,6 +220,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; @@ -249,11 +257,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; } } @@ -560,10 +568,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 fad6d5d9b32e..e98abff0399a 100644 --- a/sc/source/filter/oox/sheetdatacontext.cxx +++ b/sc/source/filter/oox/sheetdatacontext.cxx @@ -564,8 +564,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 = mxFormulaParser->importFormula( maCellData.maCellAddr, FORMULATYPE_SHAREDFORMULA, rStrm ); + mrSheetData.createSharedFormula( maCellData.maCellAddr, aTokens ); + } } } // namespace xls |