tdf#142010 XLS import: fix bad calculation after editing
Inserting a column messed up formulas in the test
document of tdf#142010. This was a regression
resulted by the tdf#89281 fix for a performance
regression in XLS import related to shared formulas.
Revert of commit ba686b9bd2596811141e4028947334f10799c356
"tdf#89281 fix performance regression of XLS import - cleanup"
and commit b18b5b7edf3d14ef5f0efe53e367f88a423088c4
"tdf#89281 fix performance regression of XLS import".
Change-Id: I96636fb1d84939385efbe7054a4271ff10b88907
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/124151
Tested-by: László Németh <nemeth@numbertext.org>
Reviewed-by: László Németh <nemeth@numbertext.org>
(cherry picked from commit 7d5703ca50d719fbd82615fb81da7949fe163ae5)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/124189
Tested-by: Jenkins
Reviewed-by: Xisco Fauli <xiscofauli@libreoffice.org>
diff --git a/compilerplugins/clang/constantparam.numbers.results b/compilerplugins/clang/constantparam.numbers.results
index 00925c1..22aa012 100644
--- a/compilerplugins/clang/constantparam.numbers.results
+++ b/compilerplugins/clang/constantparam.numbers.results
@@ -1946,14 +1946,6 @@ sc/inc/tokenarray.hxx:261
void ScTokenArray::WrapReference(const class ScAddress &,short,int)
int nMaxRow
65535
sc/inc/tokenarray.hxx:262
_Bool ScTokenArray::NeedsWrapReference(const class ScAddress &,short,int) const
short nMaxCol
255
sc/inc/tokenarray.hxx:262
_Bool ScTokenArray::NeedsWrapReference(const class ScAddress &,short,int) const
int nMaxRow
65535
sc/inc/zforauto.hxx:38
void ScNumFormatAbbrev::Save(class SvStream &,unsigned short) const
unsigned short eByteStrSet
diff --git a/sc/inc/tokenarray.hxx b/sc/inc/tokenarray.hxx
index 401ecb3..f6af464 100644
--- a/sc/inc/tokenarray.hxx
+++ b/sc/inc/tokenarray.hxx
@@ -259,7 +259,6 @@ public:
OUString CreateString( sc::TokenStringContext& rCxt, const ScAddress& rPos ) const;
void WrapReference( const ScAddress& rPos, SCCOL nMaxCol, SCROW nMaxRow );
bool NeedsWrapReference( const ScAddress& rPos, SCCOL nMaxCol, SCROW nMaxRow ) const;
sal_Int32 GetWeight() const;
diff --git a/sc/source/core/tool/token.cxx b/sc/source/core/tool/token.cxx
index 04355b8..d8579a8 100644
--- a/sc/source/core/tool/token.cxx
+++ b/sc/source/core/tool/token.cxx
@@ -5238,41 +5238,6 @@ void ScTokenArray::WrapReference( const ScAddress& rPos, SCCOL nMaxCol, SCROW nM
}
}
bool ScTokenArray::NeedsWrapReference( const ScAddress& rPos, SCCOL nMaxCol, SCROW nMaxRow ) const
{
FormulaToken** p = pCode.get();
FormulaToken** pEnd = p + static_cast<size_t>(nLen);
for (; p != pEnd; ++p)
{
switch ((*p)->GetType())
{
case svSingleRef:
{
formula::FormulaToken* pToken = *p;
ScSingleRefData& rRef = *pToken->GetSingleRef();
ScAddress aAbs = rRef.toAbs(*mxSheetLimits, rPos);
if (aAbs.Col() > nMaxCol || aAbs.Row() > nMaxRow)
return true;
}
break;
case svDoubleRef:
{
formula::FormulaToken* pToken = *p;
ScComplexRefData& rRef = *pToken->GetDoubleRef();
ScRange aAbs = rRef.toAbs(*mxSheetLimits, rPos);
// Entire columns/rows are sticky.
if ( (!rRef.IsEntireCol() && (aAbs.aStart.Row() > nMaxRow || aAbs.aEnd.Row() > nMaxRow)) ||
(!rRef.IsEntireRow() && (aAbs.aStart.Col() > nMaxCol || aAbs.aEnd.Col() > nMaxCol)))
return true;
}
break;
default:
;
}
}
return false;
}
sal_Int32 ScTokenArray::GetWeight() const
{
sal_Int32 nResult = 0;
diff --git a/sc/source/filter/excel/excform.cxx b/sc/source/filter/excel/excform.cxx
index f1374e2..d217c96 100644
--- a/sc/source/filter/excel/excform.cxx
+++ b/sc/source/filter/excel/excform.cxx
@@ -121,13 +121,8 @@ void ImportExcel::Formula(
if (pSharedCode)
{
ScFormulaCell* pCell;
if (pSharedCode->NeedsWrapReference(aScPos, EXC_MAXCOL8, EXC_MAXROW8))
{
pCell = new ScFormulaCell(rD, aScPos, pSharedCode->Clone());
pCell->GetCode()->WrapReference(aScPos, EXC_MAXCOL8, EXC_MAXROW8);
}
else
pCell = new ScFormulaCell(rD, aScPos, *pSharedCode);
pCell = new ScFormulaCell(rD, aScPos, pSharedCode->Clone());
pCell->GetCode()->WrapReference(aScPos, EXC_MAXCOL8, EXC_MAXROW8);
rDoc.getDoc().EnsureTable(aScPos.Tab());
rDoc.setFormulaCell(aScPos, pCell);
pCell->SetNeedNumberFormat(false);