summaryrefslogtreecommitdiff
path: root/sc
diff options
context:
space:
mode:
authorMarkus Mohrhard <markus.mohrhard@googlemail.com>2016-04-07 08:20:12 +0200
committerMarkus Mohrhard <markus.mohrhard@googlemail.com>2016-04-07 12:06:46 +0000
commite214df32fb3637bd7810a299fb8b38810b1a3874 (patch)
treeee7172ff2eeba066c1dcc45bbd0b985de8a780f8 /sc
parent013090d5f6855da3220fcb841c8a319526888864 (diff)
we need the position in the formula converter, tdf#99093
Change-Id: Ic3dd13aa4d4b8190b78f3e6f1cdda844e39cc719 Reviewed-on: https://gerrit.libreoffice.org/23884 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Markus Mohrhard <markus.mohrhard@googlemail.com>
Diffstat (limited to 'sc')
-rw-r--r--sc/source/filter/excel/xicontent.cxx59
1 files changed, 37 insertions, 22 deletions
diff --git a/sc/source/filter/excel/xicontent.cxx b/sc/source/filter/excel/xicontent.cxx
index edef22dfe6bb..84c43e01a1bc 100644
--- a/sc/source/filter/excel/xicontent.cxx
+++ b/sc/source/filter/excel/xicontent.cxx
@@ -789,34 +789,21 @@ void XclImpValidationManager::ReadDV( XclImpStream& rStrm )
rStrm.SetNulSubstChar( '\n' );
::std::unique_ptr< ScTokenArray > xTokArr1;
- sal_uInt16 nLen = 0;
- nLen = rStrm.ReaduInt16();
+ // We can't import the formula directly because we need the range
+ sal_uInt16 nLenFormula1 = rStrm.ReaduInt16();
rStrm.Ignore( 2 );
- if( nLen > 0 )
- {
- const ScTokenArray* pTokArr = nullptr;
- rFmlaConv.Reset();
- rFmlaConv.Convert( pTokArr, rStrm, nLen, false, FT_CondFormat );
- // formula converter owns pTokArr -> create a copy of the token array
- if( pTokArr )
- xTokArr1.reset( pTokArr->Clone() );
- }
- rStrm.SetNulSubstChar(); // back to default
+ XclImpStreamPos aPosFormula1;
+ rStrm.StorePosition(aPosFormula1);
+ rStrm.Ignore(nLenFormula1);
// second formula
::std::unique_ptr< ScTokenArray > xTokArr2;
- nLen = rStrm.ReaduInt16();
+ sal_uInt16 nLenFormula2 = rStrm.ReaduInt16();
rStrm.Ignore( 2 );
- if( nLen > 0 )
- {
- const ScTokenArray* pTokArr = nullptr;
- rFmlaConv.Reset();
- rFmlaConv.Convert( pTokArr, rStrm, nLen, false, FT_CondFormat );
- // formula converter owns pTokArr -> create a copy of the token array
- if( pTokArr )
- xTokArr2.reset( pTokArr->Clone() );
- }
+ XclImpStreamPos aPosFormula2;
+ rStrm.StorePosition(aPosFormula2);
+ rStrm.Ignore(nLenFormula2);
// read all cell ranges
XclRangeList aXclRanges;
@@ -830,6 +817,34 @@ void XclImpValidationManager::ReadDV( XclImpStream& rStrm )
if ( aScRanges.empty() )
return;
+ ScRange aCombinedRange = aScRanges.Combine();
+
+ XclImpStreamPos aCurrentPos;
+ rStrm.StorePosition(aCurrentPos);
+ rStrm.RestorePosition(aPosFormula1);
+ if( nLenFormula1 > 0 )
+ {
+ const ScTokenArray* pTokArr = nullptr;
+ rFmlaConv.Reset(aCombinedRange.aStart);
+ rFmlaConv.Convert( pTokArr, rStrm, nLenFormula1, false, FT_CondFormat );
+ // formula converter owns pTokArr -> create a copy of the token array
+ if( pTokArr )
+ xTokArr1.reset( pTokArr->Clone() );
+ }
+ rStrm.SetNulSubstChar(); // back to default
+ if (nLenFormula2 > 0)
+ {
+ rStrm.RestorePosition(aPosFormula2);
+ const ScTokenArray* pTokArr = nullptr;
+ rFmlaConv.Reset(aCombinedRange.aStart);
+ rFmlaConv.Convert( pTokArr, rStrm, nLenFormula2, false, FT_CondFormat );
+ // formula converter owns pTokArr -> create a copy of the token array
+ if( pTokArr )
+ xTokArr2.reset( pTokArr->Clone() );
+ }
+
+ rStrm.RestorePosition(aCurrentPos);
+
bool bIsValid = true; // valid settings in flags field
ScValidationMode eValMode = SC_VALID_ANY;