summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarkus Mohrhard <markus.mohrhard@collabora.co.uk>2014-12-24 04:11:08 +0100
committerAndras Timar <andras.timar@collabora.com>2015-01-04 17:05:16 +0100
commit80817430ee98fad2e6ada52a52741ef9992f4a44 (patch)
tree8ff014b567bde93385dd3e09f8abb7b53d4e27be
parent81fd0162d69f2753e669093b9bb0cd6e7693743b (diff)
reimplement shared formula import for xlsb, fdo#86734
(cherry picked from commit e1351ed4c5f9152c80b32bbaa53e3eff56671331) Change-Id: Ic5d678a2b1197ce8d83b308b0a4387bf657052d5
-rw-r--r--sc/source/filter/inc/sheetdatabuffer.hxx14
-rw-r--r--sc/source/filter/inc/worksheethelper.hxx2
-rw-r--r--sc/source/filter/oox/sheetdatabuffer.cxx19
-rw-r--r--sc/source/filter/oox/sheetdatacontext.cxx7
4 files changed, 30 insertions, 12 deletions
diff --git a/sc/source/filter/inc/sheetdatabuffer.hxx b/sc/source/filter/inc/sheetdatabuffer.hxx
index f84f91c39430..f8290bffd1f0 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 a07019a167bb..dbf199093738 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 60987c95ce9d..98cf68480316 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 bbda95922ec4..0778f22d8738 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