sc/source/filter/xml/xmlcelli.cxx | 47 ++++++++++++++++++++------------------ sc/source/filter/xml/xmlcelli.hxx | 2 + 2 files changed, 27 insertions(+), 22 deletions(-)
New commits: commit 17e8bcbca919b3ca7cac2bf9c5bac4d4ef504232 Author: Daniel Bankston <daniel.e.banks...@gmail.com> Date: Tue Jul 31 00:26:05 2012 -0500 Import intended blank or error cached formula results instead of 0 There are cases where a formula cell is exported with an office:value of 0 or no office:value at all, but the formula cell will have a text:p value which contains the intended formula result. If these cases are not taken into consideration during import, a 0 will be displayed in the cell instead of the intended special formula result (blanks or errors). These cases include when a formula result: - is blank - has a constant error value beginning with "#" (such as "#VALUE!" or "#N/A") - has an "Err:[###]" (where "[###]" is an error number) Change-Id: I8068cf1c9809c02513662f2b0a6fb16eb44920e0 diff --git a/sc/source/filter/xml/xmlcelli.cxx b/sc/source/filter/xml/xmlcelli.cxx index 21c2d14..e09868f 100644 --- a/sc/source/filter/xml/xmlcelli.cxx +++ b/sc/source/filter/xml/xmlcelli.cxx @@ -188,9 +188,9 @@ ScXMLTableRowCellContext::ScXMLTableRowCellContext( ScXMLImport& rImport, ::sax::Converter::convertDouble(fValue, sValue); bIsEmpty = false; - //if office:value="0", treat like text in case the formula - //result is "Err:###", "#N/A", or matrix reference cell with - //blank text result until we confirm otherwise. + //if office:value="0", let's get the text:p in case this is + //a special case in HasSpecialCaseFormulaText(). If it + //turns out not to be a special case, we'll use the 0 value. if(fValue == 0.0) bFormulaTextResult = true; } @@ -262,6 +262,11 @@ ScXMLTableRowCellContext::ScXMLTableRowCellContext( ScXMLImport& rImport, bFormulaTextResult = true; if(nCellType == util::NumberFormat::DATETIME) nCellType = util::NumberFormat::UNDEFINED; + //if bIsEmpty is true at this point, then there is no office value. + //we must get the text:p (even if it is empty) in case this a special + //case in HasSpecialCaseFormulaText(). + if(bIsEmpty) + bFormulaTextResult = true; } rXMLImport.GetStylesImportHelper()->SetAttributes(pStyleName, pCurrencySymbol, nCellType); } @@ -748,7 +753,7 @@ void ScXMLTableRowCellContext::SetFormulaCell(ScFormulaCell* pFCell) const { if(pFCell) { - if( bFormulaTextResult && pOUTextValue && !pOUTextValue->isEmpty() ) + if( bFormulaTextResult && pOUTextValue ) pFCell->SetHybridString( *pOUTextValue ); else pFCell->SetHybridDouble( fValue ); @@ -1109,26 +1114,23 @@ void ScXMLTableRowCellContext::AddFormulaCell( const ScAddress& rCellPos ) } } -namespace{ - -bool isSpecialValue(const rtl::OUString& rStr, sal_Int16& rnCellType) +//There are cases where a formula cell is exported with an office:value of 0 or +//no office:value at all, but the formula cell will have a text:p value which +//contains the intended formula result. +//These cases include when a formula result: +// - 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 { - if( (rStr.indexOf("Err:") > -1) || (rStr.indexOf("#N/A") > -1) ) - return true; - //If a matrix formula has a matrix reference cell that is intended to have - //a blank text result, the matrix reference cell is actually saved(export) - //as a float cell with 0 as the value and empty <text:p/>. - //Import works around this by setting these cells as text cells so that - //the blank text is used for display instead of the number 0. - if( rStr.isEmpty() ) - { - rnCellType = util::NumberFormat::TEXT; + if( pOUTextContent && + ( pOUTextContent->isEmpty() || (pOUTextContent->indexOf("#") > -1) || + (pOUTextContent->indexOf("Err:") > -1) ) + ) return true; - } return false; } -} void ScXMLTableRowCellContext::EndElement() { @@ -1146,10 +1148,11 @@ void ScXMLTableRowCellContext::EndElement() } } - //if this is a blank matrix formula result, "Err:###", or "#N/A" then - //use text:p string because of the way export saves these types of cells. - if( bFormulaTextResult && pOUTextContent && isSpecialValue(*pOUTextContent, nCellType) ) + if( bFormulaTextResult && HasSpecialCaseFormulaText() ) + { pOUTextValue.reset(*pOUTextContent); + nCellType = util::NumberFormat::TEXT; + } ScAddress aCellPos = rXMLImport.GetTables().GetCurrentCellPos(); if( aCellPos.Col() > 0 && nRepeatedRows > 1 ) diff --git a/sc/source/filter/xml/xmlcelli.hxx b/sc/source/filter/xml/xmlcelli.hxx index b16eff5..761045c 100644 --- a/sc/source/filter/xml/xmlcelli.hxx +++ b/sc/source/filter/xml/xmlcelli.hxx @@ -101,6 +101,8 @@ class ScXMLTableRowCellContext : public SvXMLImportContext void PutFormulaCell ( const ScAddress& rScCurrentPos ); void AddFormulaCell ( const ScAddress& rScCellPos ); + bool HasSpecialCaseFormulaText() const; + public: ScXMLTableRowCellContext( ScXMLImport& rImport, sal_uInt16 nPrfx, _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits