summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarkus Mohrhard <markus.mohrhard@googlemail.com>2013-01-24 23:22:14 +0100
committerMarkus Mohrhard <markus.mohrhard@googlemail.com>2013-01-25 13:19:20 +0100
commit3a1f90a6c7fa0c0604acac6d76f9d4ef3ac20311 (patch)
tree51924cfd03b41891e9830c2cbc1a6e3958a04d73
parent255bec2034fe80a53354b956e46591097880220b (diff)
improve handling of error cells in cahced value import
We are finally able to handle error cells of the type Err:* and the patch drastically reduces the number of string comparisons needed during cached value import. Change-Id: I4c0a2ed2561862615fe745d1a556e4004fd28d8f
-rw-r--r--sc/source/filter/xml/xmlcelli.cxx34
-rw-r--r--sc/source/filter/xml/xmlcelli.hxx6
2 files changed, 26 insertions, 14 deletions
diff --git a/sc/source/filter/xml/xmlcelli.cxx b/sc/source/filter/xml/xmlcelli.cxx
index f3265cab55c8..0eeeecb36597 100644
--- a/sc/source/filter/xml/xmlcelli.cxx
+++ b/sc/source/filter/xml/xmlcelli.cxx
@@ -122,7 +122,9 @@ ScXMLTableRowCellContext::ScXMLTableRowCellContext( ScXMLImport& rImport,
bHasTextImport(false),
bIsFirstTextImport(false),
bSolarMutexLocked(false),
- bFormulaTextResult(false)
+ bFormulaTextResult(false),
+ mbPossibleErrorCell(false),
+ mbCheckWithCompilerForError(false)
{
rtl::math::setNan(&fValue); // NaN by default
@@ -729,7 +731,7 @@ void ScXMLTableRowCellContext::SetFormulaCell(ScFormulaCell* pFCell) const
{
if( bFormulaTextResult && pOUTextValue )
{
- if (!GetScImport().IsFormulaErrorConstant(*pOUTextValue))
+ if( !IsPossibleErrorString() )
{
pFCell->SetHybridString( *pOUTextValue );
pFCell->ResetDirty();
@@ -772,7 +774,7 @@ void ScXMLTableRowCellContext::PutTextCell( const ScAddress& rCurrentPos,
if(!aCellString.isEmpty())
{
- if (bDoIncrement && !GetScImport().IsFormulaErrorConstant(aCellString))
+ if (bDoIncrement && !IsPossibleErrorString())
{
pFCell->SetHybridString( aCellString );
pFCell->ResetDirty();
@@ -1119,7 +1121,7 @@ void ScXMLTableRowCellContext::AddFormulaCell( const ScAddress& rCellPos )
ScMatrixRef pMat(new ScMatrix(nMatrixCols, nMatrixRows));
if (bFormulaTextResult && pOUTextValue)
{
- if (!GetScImport().IsFormulaErrorConstant(*pOUTextValue))
+ if (!IsPossibleErrorString())
{
pFCell->SetResultMatrix(
nMatrixCols, nMatrixRows, pMat, new formula::FormulaStringToken(*pOUTextValue));
@@ -1159,14 +1161,20 @@ void ScXMLTableRowCellContext::AddFormulaCell( const ScAddress& rCellPos )
// - is blank
// - has a constant error value beginning with "#" (such as "#VALUE!" or "#N/A")
// - has an "Err:[###]" (where "[###]" is an error number)
-bool ScXMLTableRowCellContext::HasSpecialCaseFormulaText() const
+void ScXMLTableRowCellContext::HasSpecialCaseFormulaText()
{
- if( pOUTextContent &&
- ( pOUTextContent->isEmpty() || (pOUTextContent->indexOf("#") > -1) ||
- (pOUTextContent->indexOf("Err:") > -1) )
- )
- return true;
- return false;
+ if( pOUTextContent )
+ {
+ if ( pOUTextContent->isEmpty() || (pOUTextContent->indexOf("Err:") > -1) )
+ mbPossibleErrorCell = true;
+ else if (pOUTextContent->indexOf("#") > -1)
+ mbCheckWithCompilerForError = true;
+ }
+}
+
+bool ScXMLTableRowCellContext::IsPossibleErrorString() const
+{
+ return mbPossibleErrorCell || ( mbCheckWithCompilerForError && GetScImport().IsFormulaErrorConstant(*pOUTextValue) );
}
@@ -1185,8 +1193,8 @@ void ScXMLTableRowCellContext::EndElement()
aTextImport->ResetCursor();
}
}
-
- if( bFormulaTextResult && HasSpecialCaseFormulaText() )
+ HasSpecialCaseFormulaText();
+ if( bFormulaTextResult && (mbPossibleErrorCell || mbCheckWithCompilerForError) )
{
pOUTextValue.reset(*pOUTextContent);
nCellType = util::NumberFormat::TEXT;
diff --git a/sc/source/filter/xml/xmlcelli.hxx b/sc/source/filter/xml/xmlcelli.hxx
index 32f0698e9ad4..2bf8b8c6a3e1 100644
--- a/sc/source/filter/xml/xmlcelli.hxx
+++ b/sc/source/filter/xml/xmlcelli.hxx
@@ -65,6 +65,8 @@ class ScXMLTableRowCellContext : public SvXMLImportContext
bool bIsFirstTextImport;
bool bSolarMutexLocked;
bool bFormulaTextResult;
+ bool mbPossibleErrorCell;
+ bool mbCheckWithCompilerForError;
const ScXMLImport& GetScImport() const { return (const ScXMLImport&)GetImport(); }
ScXMLImport& GetScImport() { return (ScXMLImport&)GetImport(); }
@@ -92,7 +94,9 @@ class ScXMLTableRowCellContext : public SvXMLImportContext
void PutFormulaCell ( const ScAddress& rScCurrentPos );
void AddFormulaCell ( const ScAddress& rScCellPos );
- bool HasSpecialCaseFormulaText() const;
+ void HasSpecialCaseFormulaText();
+
+ bool IsPossibleErrorString() const;
public: