include/xmloff/numehelp.hxx | 9 + sc/inc/document.hxx | 18 +-- sc/source/filter/xml/xmlcelli.cxx | 29 +++++- sc/source/filter/xml/xmlcelli.hxx | 2 sc/source/filter/xml/xmlexprt.cxx | 179 +++++++++++++++++++++----------------- sc/source/filter/xml/xmlexprt.hxx | 2 sc/source/filter/xml/xmlimprt.cxx | 31 +++--- sc/source/filter/xml/xmlimprt.hxx | 1 sc/source/filter/xml/xmlsubti.cxx | 2 xmloff/source/style/numehelp.cxx | 27 ++--- 10 files changed, 178 insertions(+), 122 deletions(-)
New commits: commit 53f7f39818e22ca1bf049c2e3fea845ac49e5bfc Author: Markus Mohrhard <[email protected]> Date: Thu Apr 25 16:58:36 2013 +0200 prevent unnecessary String->OUString conversions Change-Id: I075467d17f6c59bd66a7a2d8e1e82f2a3ba42cad diff --git a/sc/source/filter/xml/xmlsubti.cxx b/sc/source/filter/xml/xmlsubti.cxx index 1228827..a92abe7 100644 --- a/sc/source/filter/xml/xmlsubti.cxx +++ b/sc/source/filter/xml/xmlsubti.cxx @@ -290,7 +290,7 @@ void ScMyTables::AddMatrixRange( pDoc->InsertMatrixFormula( aScRange.aStart.Col(), aScRange.aStart.Row(), aScRange.aEnd.Col(), aScRange.aEnd.Row(), - aMark, EMPTY_STRING, pCode, eGrammar, false ); + aMark, EMPTY_OUSTRING, pCode, eGrammar, false ); delete pCode; pDoc->IncXMLImportedFormulaCount( rFormula.getLength() ); } commit bb369fd9b7f38eed85eb925432b337414864c2d0 Author: Markus Mohrhard <[email protected]> Date: Wed Apr 24 23:16:37 2013 +0200 remove some unnecessary whitespace in document.hxx Change-Id: Iab19ae876162e72104267ad5f760f55e7d854934 diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx index afdd493..71dfb2c 100644 --- a/sc/inc/document.hxx +++ b/sc/inc/document.hxx @@ -781,9 +781,9 @@ public: void SetEmptyCell( const ScAddress& rPos ); - SC_DLLPUBLIC void SetValue( SCCOL nCol, SCROW nRow, SCTAB nTab, const double& rVal ); + SC_DLLPUBLIC void SetValue( SCCOL nCol, SCROW nRow, SCTAB nTab, const double& rVal ); SC_DLLPUBLIC void SetValue( const ScAddress& rPos, double fVal ); - void SetError( SCCOL nCol, SCROW nRow, SCTAB nTab, const sal_uInt16 nError); + void SetError( SCCOL nCol, SCROW nRow, SCTAB nTab, const sal_uInt16 nError); SC_DLLPUBLIC void SetFormula( const ScAddress& rPos, const ScTokenArray& rArray, @@ -795,14 +795,14 @@ public: SC_DLLPUBLIC void SetFormulaCell( const ScAddress& rPos, ScFormulaCell* pCell ); - SC_DLLPUBLIC void InsertMatrixFormula(SCCOL nCol1, SCROW nRow1, + SC_DLLPUBLIC void InsertMatrixFormula(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, const ScMarkData& rMark, const OUString& rFormula, const ScTokenArray* p = NULL, const formula::FormulaGrammar::Grammar = formula::FormulaGrammar::GRAM_DEFAULT, bool bDirtyFlag=true ); - SC_DLLPUBLIC void InsertTableOp(const ScTabOpParam& rParam, // multi-operation + SC_DLLPUBLIC void InsertTableOp(const ScTabOpParam& rParam, // multi-operation SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, const ScMarkData& rMark); @@ -830,19 +830,19 @@ public: */ double* GetValueCell( const ScAddress& rPos ); - SC_DLLPUBLIC void GetInputString( SCCOL nCol, SCROW nRow, SCTAB nTab, String& rString ); - SC_DLLPUBLIC void GetInputString( SCCOL nCol, SCROW nRow, SCTAB nTab, OUString& rString ); - sal_uInt16 GetStringForFormula( const ScAddress& rPos, OUString& rString ); + SC_DLLPUBLIC void GetInputString( SCCOL nCol, SCROW nRow, SCTAB nTab, String& rString ); + SC_DLLPUBLIC void GetInputString( SCCOL nCol, SCROW nRow, SCTAB nTab, OUString& rString ); + sal_uInt16 GetStringForFormula( const ScAddress& rPos, OUString& rString ); SC_DLLPUBLIC double GetValue( const ScAddress& rPos ) const; SC_DLLPUBLIC double GetValue( SCCOL nCol, SCROW nRow, SCTAB nTab ) const { ScAddress aAdr(nCol, nRow, nTab); return GetValue(aAdr);} SC_DLLPUBLIC void GetValue( SCCOL nCol, SCROW nRow, SCTAB nTab, double& rValue ) const; SC_DLLPUBLIC const EditTextObject* GetEditText( const ScAddress& rPos ) const; void RemoveEditTextCharAttribs( const ScAddress& rPos, const ScPatternAttr& rAttr ); SC_DLLPUBLIC double RoundValueAsShown( double fVal, sal_uInt32 nFormat ) const; - SC_DLLPUBLIC void GetNumberFormat( SCCOL nCol, SCROW nRow, SCTAB nTab, + SC_DLLPUBLIC void GetNumberFormat( SCCOL nCol, SCROW nRow, SCTAB nTab, sal_uInt32& rFormat ) const; sal_uInt32 GetNumberFormat( const ScRange& rRange ) const; - SC_DLLPUBLIC sal_uInt32 GetNumberFormat( const ScAddress& ) const; + SC_DLLPUBLIC sal_uInt32 GetNumberFormat( const ScAddress& ) const; void SetNumberFormat( const ScAddress& rPos, sal_uInt32 nNumberFormat ); /** commit 9fb60c6a7390f782f1878f0e943ba17fd419ebab Author: Markus Mohrhard <[email protected]> Date: Wed Apr 24 22:56:05 2013 +0200 implement import for calcext:value-type This saves us several string comparisons for every cell during import which should speed-up our cached value import quite a bit. I haven't profiled it yet. Additionally it lets us move away from a heuristic based approach. Change-Id: Id9ca92a1251b62e99ca54209fdd52031694784b1 diff --git a/sc/source/filter/xml/xmlcelli.cxx b/sc/source/filter/xml/xmlcelli.cxx index b97a245..556f27b 100644 --- a/sc/source/filter/xml/xmlcelli.cxx +++ b/sc/source/filter/xml/xmlcelli.cxx @@ -149,6 +149,8 @@ ScXMLTableRowCellContext::ScXMLTableRowCellContext( ScXMLImport& rImport, bIsMatrix(false), bIsCovered(bTempIsCovered), bIsEmpty(true), + mbNewValueType(false), + mbErrorValue(false), bIsFirstTextImport(false), bSolarMutexLocked(false), bFormulaTextResult(false), @@ -207,6 +209,14 @@ ScXMLTableRowCellContext::ScXMLTableRowCellContext( ScXMLImport& rImport, nCellType = GetScImport().GetCellType(sValue); bIsEmpty = false; break; + case XML_TOK_TABLE_ROW_CELL_ATTR_NEW_VALUE_TYPE: + if(sValue == "error") + mbErrorValue = true; + else + nCellType = GetScImport().GetCellType(sValue); + bIsEmpty = false; + mbNewValueType = true; + break; case XML_TOK_TABLE_ROW_CELL_ATTR_VALUE: { if (!sValue.isEmpty()) @@ -968,7 +978,12 @@ void ScXMLTableRowCellContext::SetFormulaCell(ScFormulaCell* pFCell) const { if(pFCell) { - if( bFormulaTextResult && maStringValue ) + if(mbErrorValue) + { + // don't do anything here + // we need to recalc anyway + } + else if( bFormulaTextResult && maStringValue ) { if( !IsPossibleErrorString() ) { @@ -1010,6 +1025,9 @@ void ScXMLTableRowCellContext::PutTextCell( const ScAddress& rCurrentPos, else bDoIncrement = false; + if(mbErrorValue) + bDoIncrement = false; + if(!aCellString.isEmpty()) { if (bDoIncrement && !IsPossibleErrorString()) @@ -1422,9 +1440,10 @@ 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) +// Libreoffice 4.1+ with ODF1.2 extended write however calcext:value-type="error" in that case void ScXMLTableRowCellContext::HasSpecialCaseFormulaText() { - if (!mbEditEngineHasText) + if (!mbEditEngineHasText || mbNewValueType) return; OUString aStr = mpEditEngine->GetText(0); @@ -1436,7 +1455,11 @@ void ScXMLTableRowCellContext::HasSpecialCaseFormulaText() bool ScXMLTableRowCellContext::IsPossibleErrorString() const { - return mbPossibleErrorCell || ( mbCheckWithCompilerForError && GetScImport().IsFormulaErrorConstant(*maStringValue) ); + if(mbNewValueType && !mbErrorValue) + return false; + else if(mbNewValueType && mbErrorValue) + return true; + return mbPossibleErrorCell || ( mbCheckWithCompilerForError && GetScImport().IsFormulaErrorConstant(*maStringValue) ); } diff --git a/sc/source/filter/xml/xmlcelli.hxx b/sc/source/filter/xml/xmlcelli.hxx index 7555a46..6874e5e 100644 --- a/sc/source/filter/xml/xmlcelli.hxx +++ b/sc/source/filter/xml/xmlcelli.hxx @@ -84,6 +84,8 @@ class ScXMLTableRowCellContext : public ScXMLImportContext bool bIsMatrix; bool bIsCovered; bool bIsEmpty; + bool mbNewValueType; + bool mbErrorValue; bool bIsFirstTextImport; bool bSolarMutexLocked; bool bFormulaTextResult; diff --git a/sc/source/filter/xml/xmlimprt.cxx b/sc/source/filter/xml/xmlimprt.cxx index 315695b..c7ec58c 100644 --- a/sc/source/filter/xml/xmlimprt.cxx +++ b/sc/source/filter/xml/xmlimprt.cxx @@ -210,6 +210,7 @@ const SvXMLTokenMap& ScXMLImport::GetTableRowCellAttrTokenMap() { XML_NAMESPACE_TABLE, XML_NUMBER_MATRIX_ROWS_SPANNED, XML_TOK_TABLE_ROW_CELL_ATTR_SPANNED_MATRIX_ROWS }, { XML_NAMESPACE_TABLE, XML_NUMBER_COLUMNS_REPEATED, XML_TOK_TABLE_ROW_CELL_ATTR_REPEATED }, { XML_NAMESPACE_OFFICE, XML_VALUE_TYPE, XML_TOK_TABLE_ROW_CELL_ATTR_VALUE_TYPE }, + { XML_NAMESPACE_CALC_EXT, XML_VALUE_TYPE, XML_TOK_TABLE_ROW_CELL_ATTR_NEW_VALUE_TYPE }, { XML_NAMESPACE_OFFICE, XML_VALUE, XML_TOK_TABLE_ROW_CELL_ATTR_VALUE }, { XML_NAMESPACE_OFFICE, XML_DATE_VALUE, XML_TOK_TABLE_ROW_CELL_ATTR_DATE_VALUE }, { XML_NAMESPACE_OFFICE, XML_TIME_VALUE, XML_TOK_TABLE_ROW_CELL_ATTR_TIME_VALUE }, diff --git a/sc/source/filter/xml/xmlimprt.hxx b/sc/source/filter/xml/xmlimprt.hxx index 0e63909..aa85f7e 100644 --- a/sc/source/filter/xml/xmlimprt.hxx +++ b/sc/source/filter/xml/xmlimprt.hxx @@ -339,6 +339,7 @@ enum ScXMLTableRowCellAttrTokens XML_TOK_TABLE_ROW_CELL_ATTR_SPANNED_MATRIX_ROWS, XML_TOK_TABLE_ROW_CELL_ATTR_REPEATED, XML_TOK_TABLE_ROW_CELL_ATTR_VALUE_TYPE, + XML_TOK_TABLE_ROW_CELL_ATTR_NEW_VALUE_TYPE, XML_TOK_TABLE_ROW_CELL_ATTR_VALUE, XML_TOK_TABLE_ROW_CELL_ATTR_DATE_VALUE, XML_TOK_TABLE_ROW_CELL_ATTR_TIME_VALUE, commit d691181f9ead97bba8970759255ba64f6c26aee6 Author: Markus Mohrhard <[email protected]> Date: Wed Apr 24 19:01:36 2013 +0200 remove a bit of unnecessary whitespace to make lines shorter Change-Id: I364afb6d638f47a41ea31bf3df00540db417d505 diff --git a/sc/source/filter/xml/xmlimprt.cxx b/sc/source/filter/xml/xmlimprt.cxx index efccaee..315695b 100644 --- a/sc/source/filter/xml/xmlimprt.cxx +++ b/sc/source/filter/xml/xmlimprt.cxx @@ -202,21 +202,21 @@ const SvXMLTokenMap& ScXMLImport::GetTableRowCellAttrTokenMap() { static SvXMLTokenMapEntry aTableRowCellAttrTokenMap[] = { - { XML_NAMESPACE_TABLE, XML_STYLE_NAME, XML_TOK_TABLE_ROW_CELL_ATTR_STYLE_NAME }, - { XML_NAMESPACE_TABLE, XML_CONTENT_VALIDATION_NAME, XML_TOK_TABLE_ROW_CELL_ATTR_CONTENT_VALIDATION_NAME }, - { XML_NAMESPACE_TABLE, XML_NUMBER_ROWS_SPANNED, XML_TOK_TABLE_ROW_CELL_ATTR_SPANNED_ROWS }, - { XML_NAMESPACE_TABLE, XML_NUMBER_COLUMNS_SPANNED, XML_TOK_TABLE_ROW_CELL_ATTR_SPANNED_COLS }, - { XML_NAMESPACE_TABLE, XML_NUMBER_MATRIX_COLUMNS_SPANNED, XML_TOK_TABLE_ROW_CELL_ATTR_SPANNED_MATRIX_COLS }, - { XML_NAMESPACE_TABLE, XML_NUMBER_MATRIX_ROWS_SPANNED, XML_TOK_TABLE_ROW_CELL_ATTR_SPANNED_MATRIX_ROWS }, - { XML_NAMESPACE_TABLE, XML_NUMBER_COLUMNS_REPEATED, XML_TOK_TABLE_ROW_CELL_ATTR_REPEATED }, - { XML_NAMESPACE_OFFICE, XML_VALUE_TYPE, XML_TOK_TABLE_ROW_CELL_ATTR_VALUE_TYPE }, - { XML_NAMESPACE_OFFICE, XML_VALUE, XML_TOK_TABLE_ROW_CELL_ATTR_VALUE }, - { XML_NAMESPACE_OFFICE, XML_DATE_VALUE, XML_TOK_TABLE_ROW_CELL_ATTR_DATE_VALUE }, - { XML_NAMESPACE_OFFICE, XML_TIME_VALUE, XML_TOK_TABLE_ROW_CELL_ATTR_TIME_VALUE }, - { XML_NAMESPACE_OFFICE, XML_STRING_VALUE, XML_TOK_TABLE_ROW_CELL_ATTR_STRING_VALUE }, - { XML_NAMESPACE_OFFICE, XML_BOOLEAN_VALUE, XML_TOK_TABLE_ROW_CELL_ATTR_BOOLEAN_VALUE }, - { XML_NAMESPACE_TABLE, XML_FORMULA, XML_TOK_TABLE_ROW_CELL_ATTR_FORMULA }, - { XML_NAMESPACE_OFFICE, XML_CURRENCY, XML_TOK_TABLE_ROW_CELL_ATTR_CURRENCY }, + { XML_NAMESPACE_TABLE, XML_STYLE_NAME, XML_TOK_TABLE_ROW_CELL_ATTR_STYLE_NAME }, + { XML_NAMESPACE_TABLE, XML_CONTENT_VALIDATION_NAME, XML_TOK_TABLE_ROW_CELL_ATTR_CONTENT_VALIDATION_NAME }, + { XML_NAMESPACE_TABLE, XML_NUMBER_ROWS_SPANNED, XML_TOK_TABLE_ROW_CELL_ATTR_SPANNED_ROWS }, + { XML_NAMESPACE_TABLE, XML_NUMBER_COLUMNS_SPANNED, XML_TOK_TABLE_ROW_CELL_ATTR_SPANNED_COLS }, + { XML_NAMESPACE_TABLE, XML_NUMBER_MATRIX_COLUMNS_SPANNED, XML_TOK_TABLE_ROW_CELL_ATTR_SPANNED_MATRIX_COLS }, + { XML_NAMESPACE_TABLE, XML_NUMBER_MATRIX_ROWS_SPANNED, XML_TOK_TABLE_ROW_CELL_ATTR_SPANNED_MATRIX_ROWS }, + { XML_NAMESPACE_TABLE, XML_NUMBER_COLUMNS_REPEATED, XML_TOK_TABLE_ROW_CELL_ATTR_REPEATED }, + { XML_NAMESPACE_OFFICE, XML_VALUE_TYPE, XML_TOK_TABLE_ROW_CELL_ATTR_VALUE_TYPE }, + { XML_NAMESPACE_OFFICE, XML_VALUE, XML_TOK_TABLE_ROW_CELL_ATTR_VALUE }, + { XML_NAMESPACE_OFFICE, XML_DATE_VALUE, XML_TOK_TABLE_ROW_CELL_ATTR_DATE_VALUE }, + { XML_NAMESPACE_OFFICE, XML_TIME_VALUE, XML_TOK_TABLE_ROW_CELL_ATTR_TIME_VALUE }, + { XML_NAMESPACE_OFFICE, XML_STRING_VALUE, XML_TOK_TABLE_ROW_CELL_ATTR_STRING_VALUE }, + { XML_NAMESPACE_OFFICE, XML_BOOLEAN_VALUE, XML_TOK_TABLE_ROW_CELL_ATTR_BOOLEAN_VALUE }, + { XML_NAMESPACE_TABLE, XML_FORMULA, XML_TOK_TABLE_ROW_CELL_ATTR_FORMULA }, + { XML_NAMESPACE_OFFICE, XML_CURRENCY, XML_TOK_TABLE_ROW_CELL_ATTR_CURRENCY }, XML_TOKEN_MAP_END }; commit a0ba44951c54f2331f8ce25c24d8f59fb8d2a6d5 Author: Markus Mohrhard <[email protected]> Date: Wed Apr 24 18:53:54 2013 +0200 ScXMLExport::GetCellText returned always true Change-Id: Ia5dbea0a496f578f619276def349ff21674fb644 diff --git a/sc/source/filter/xml/xmlexprt.cxx b/sc/source/filter/xml/xmlexprt.cxx index 1e25b28..8a059e5 100644 --- a/sc/source/filter/xml/xmlexprt.cxx +++ b/sc/source/filter/xml/xmlexprt.cxx @@ -2635,15 +2635,12 @@ bool ScXMLExport::IsMatrix (const ScAddress& aCell, return false; } -bool ScXMLExport::GetCellText (ScMyCell& rMyCell, const ScAddress& aPos) const +void ScXMLExport::GetCellText (ScMyCell& rMyCell, const ScAddress& aPos) const { - if (rMyCell.bHasStringValue) - return true; - else + if (!rMyCell.bHasStringValue) { - rMyCell.sStringValue = ScCellObj::GetOutputString_Impl(pDoc, aPos); - rMyCell.bHasStringValue = true; - return true; + rMyCell.sStringValue = ScCellObj::GetOutputString_Impl(pDoc, aPos); + rMyCell.bHasStringValue = true; } } @@ -2891,15 +2888,13 @@ void ScXMLExport::WriteCell(ScMyCell& aCell, sal_Int32 nEqualCellCount) break; case table::CellContentType_TEXT : { - if (GetCellText(aCell, aCellPos)) - { - OUString sFormula(lcl_GetRawString(pDoc, aCellPos)); - GetNumberFormatAttributesExportHelper()->SetNumberFormatAttributes( + GetCellText(aCell, aCellPos); + OUString sFormula(lcl_GetRawString(pDoc, aCellPos)); + GetNumberFormatAttributesExportHelper()->SetNumberFormatAttributes( sFormula, aCell.sStringValue, true, true); - if( getDefaultVersion() >= SvtSaveOptions::ODFVER_012 ) - GetNumberFormatAttributesExportHelper()->SetNumberFormatAttributes( - sFormula, aCell.sStringValue, false, true, XML_NAMESPACE_CALC_EXT); - } + if( getDefaultVersion() >= SvtSaveOptions::ODFVER_012 ) + GetNumberFormatAttributesExportHelper()->SetNumberFormatAttributes( + sFormula, aCell.sStringValue, false, true, XML_NAMESPACE_CALC_EXT); } break; case table::CellContentType_FORMULA : @@ -2973,16 +2968,16 @@ void ScXMLExport::WriteCell(ScMyCell& aCell, sal_Int32 nEqualCellCount) } else { - if (GetCellText(aCell, aCellPos)) - if (!aCell.sStringValue.isEmpty()) + GetCellText(aCell, aCellPos); + if (!aCell.sStringValue.isEmpty()) + { + AddAttribute(sAttrValueType, XML_STRING); + AddAttribute(sAttrStringValue, aCell.sStringValue); + if( getDefaultVersion() >= SvtSaveOptions::ODFVER_012 ) { - AddAttribute(sAttrValueType, XML_STRING); - AddAttribute(sAttrStringValue, aCell.sStringValue); - if( getDefaultVersion() >= SvtSaveOptions::ODFVER_012 ) - { - AddAttribute(XML_NAMESPACE_CALC_EXT,XML_VALUE_TYPE, XML_STRING); - } + AddAttribute(XML_NAMESPACE_CALC_EXT,XML_VALUE_TYPE, XML_STRING); } + } } } } @@ -3031,8 +3026,8 @@ void ScXMLExport::WriteCell(ScMyCell& aCell, sal_Int32 nEqualCellCount) { SvXMLElementExport aElemP(*this, sElemP, true, false); bool bPrevCharWasSpace(true); - if (GetCellText(aCell, aCellPos)) - GetTextParagraphExport()->exportText(aCell.sStringValue, bPrevCharWasSpace); + GetCellText(aCell, aCellPos); + GetTextParagraphExport()->exportText(aCell.sStringValue, bPrevCharWasSpace); } } WriteShapes(aCell); @@ -3507,13 +3502,10 @@ bool ScXMLExport::IsCellEqual (ScMyCell& aCell1, ScMyCell& aCell2) bIsEqual = false; else { - if (GetCellText(aCell1, aCellPos1) && GetCellText(aCell2, aCellPos2)) - { - bIsEqual = (aCell1.sStringValue == aCell2.sStringValue) && - (lcl_GetRawString(pDoc, aCellPos1) == lcl_GetRawString(pDoc, aCellPos2)); - } - else - bIsEqual = false; + GetCellText(aCell1, aCellPos1); + GetCellText(aCell2, aCellPos2); + bIsEqual = (aCell1.sStringValue == aCell2.sStringValue) && + (lcl_GetRawString(pDoc, aCellPos1) == lcl_GetRawString(pDoc, aCellPos2)); } } break; diff --git a/sc/source/filter/xml/xmlexprt.hxx b/sc/source/filter/xml/xmlexprt.hxx index 6cd196c..b3bfdb1 100644 --- a/sc/source/filter/xml/xmlexprt.hxx +++ b/sc/source/filter/xml/xmlexprt.hxx @@ -170,7 +170,7 @@ class ScXMLExport : public SvXMLExport bool GetMerged (const com::sun::star::table::CellRangeAddress* pCellRange, const com::sun::star::uno::Reference <com::sun::star::sheet::XSpreadsheet>& xTable); - bool GetCellText (ScMyCell& rMyCell, const ScAddress& aPos) const; + void GetCellText (ScMyCell& rMyCell, const ScAddress& aPos) const; void WriteTable(sal_Int32 nTable, const ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XSpreadsheet>& xTable); void WriteCell(ScMyCell& aCell, sal_Int32 nEqualCellCount); commit a8b7c72425aabae87bfd2e141aa06f06319ae11c Author: Markus Mohrhard <[email protected]> Date: Wed Apr 24 18:45:15 2013 +0200 add error to office:value-type for calc cells and fdo#51810 For cached value import we need the information which cells are error cells. For ODF 1.2 extended we therefore export now calcext:office-value with the additional value "error". Change-Id: I9bc988ea4924bea767ba5e504b77f6a16e51a82e diff --git a/include/xmloff/numehelp.hxx b/include/xmloff/numehelp.hxx index 9f0bac4..7aa3922 100644 --- a/include/xmloff/numehelp.hxx +++ b/include/xmloff/numehelp.hxx @@ -21,6 +21,7 @@ #define XMLOFF_NUMEHELP_HXX #include "sal/config.h" +#include "xmloff/xmlnmspe.hxx" #include "xmloff/dllapi.h" #include <sal/types.h> #include <com/sun/star/frame/XModel.hpp> @@ -59,7 +60,6 @@ class XMLOFF_DLLPUBLIC XMLNumberFormatAttributesExportHelper const OUString sEmpty; const OUString sStandardFormat; const OUString sType; - const OUString sAttrValueType; const OUString sAttrValue; const OUString sAttrDateValue; const OUString sAttrTimeValue; @@ -101,14 +101,15 @@ public : void WriteAttributes(const sal_Int16 nTypeKey, const double& rValue, const OUString& rCurrencySymbol, - sal_Bool bExportValue = sal_True); + sal_Bool bExportValue = sal_True, sal_uInt16 nNamespace = XML_NAMESPACE_OFFICE); void SetNumberFormatAttributes(const sal_Int32 nNumberFormat, const double& rValue, - sal_Bool bExportValue = sal_True); + sal_Bool bExportValue = sal_True, sal_uInt16 nNamespace = XML_NAMESPACE_OFFICE); void SetNumberFormatAttributes(const OUString& rValue, const OUString& rCharacters, sal_Bool bExportValue = sal_True, - sal_Bool bExportTypeAttribute = sal_True); + sal_Bool bExportTypeAttribute = sal_True, + sal_uInt16 nNamespace = XML_NAMESPACE_OFFICE); }; #endif diff --git a/sc/source/filter/xml/xmlexprt.cxx b/sc/source/filter/xml/xmlexprt.cxx index 8b86e60..1e25b28 100644 --- a/sc/source/filter/xml/xmlexprt.cxx +++ b/sc/source/filter/xml/xmlexprt.cxx @@ -2884,6 +2884,9 @@ void ScXMLExport::WriteCell(ScMyCell& aCell, sal_Int32 nEqualCellCount) } GetNumberFormatAttributesExportHelper()->SetNumberFormatAttributes( aCell.nNumberFormat, aCell.fValue); + if( getDefaultVersion() >= SvtSaveOptions::ODFVER_012 ) + GetNumberFormatAttributesExportHelper()->SetNumberFormatAttributes( + aCell.nNumberFormat, aCell.fValue, false, XML_NAMESPACE_CALC_EXT); } break; case table::CellContentType_TEXT : @@ -2893,6 +2896,9 @@ void ScXMLExport::WriteCell(ScMyCell& aCell, sal_Int32 nEqualCellCount) OUString sFormula(lcl_GetRawString(pDoc, aCellPos)); GetNumberFormatAttributesExportHelper()->SetNumberFormatAttributes( sFormula, aCell.sStringValue, true, true); + if( getDefaultVersion() >= SvtSaveOptions::ODFVER_012 ) + GetNumberFormatAttributesExportHelper()->SetNumberFormatAttributes( + sFormula, aCell.sStringValue, false, true, XML_NAMESPACE_CALC_EXT); } } break; @@ -2919,7 +2925,18 @@ void ScXMLExport::WriteCell(ScMyCell& aCell, sal_Int32 nEqualCellCount) AddAttribute(sAttrFormula, GetNamespaceMap().GetQNameByKey( nNamespacePrefix, sOUFormula.copy(1, sOUFormula.getLength() - 2), false )); } } - if (pFormulaCell->IsValue()) + if (pFormulaCell->GetErrCode()) + { + GetCellText(aCell, aCellPos); + AddAttribute(sAttrValueType, XML_STRING); + AddAttribute(sAttrStringValue, aCell.sStringValue); + if( getDefaultVersion() >= SvtSaveOptions::ODFVER_012 ) + { + //export calcext:value-type="error" + AddAttribute(XML_NAMESPACE_CALC_EXT,XML_VALUE_TYPE, OUString("error")); + } + } + else if (pFormulaCell->IsValue()) { bool bIsStandard; OUString sCurrency; @@ -2927,15 +2944,31 @@ void ScXMLExport::WriteCell(ScMyCell& aCell, sal_Int32 nEqualCellCount) if (bIsStandard) { if (pDoc) + { GetNumberFormatAttributesExportHelper()->SetNumberFormatAttributes( pFormulaCell->GetStandardFormat(*pDoc->GetFormatTable(), 0), pDoc->GetValue( aCellPos )); + if( getDefaultVersion() >= SvtSaveOptions::ODFVER_012 ) + { + GetNumberFormatAttributesExportHelper()->SetNumberFormatAttributes( + pFormulaCell->GetStandardFormat(*pDoc->GetFormatTable(), 0), + pDoc->GetValue( aCellPos ), false, XML_NAMESPACE_CALC_EXT); + } + } } else { if (pDoc) - GetNumberFormatAttributesExportHelper()->SetNumberFormatAttributes( - aCell.nNumberFormat, pDoc->GetValue( aCellPos )); + { + GetNumberFormatAttributesExportHelper()->SetNumberFormatAttributes( + aCell.nNumberFormat, pDoc->GetValue( aCellPos )); + if( getDefaultVersion() >= SvtSaveOptions::ODFVER_012 ) + { + GetNumberFormatAttributesExportHelper()->SetNumberFormatAttributes( + aCell.nNumberFormat, pDoc->GetValue( aCellPos ), false, XML_NAMESPACE_CALC_EXT ); + + } + } } } else @@ -2945,6 +2978,10 @@ void ScXMLExport::WriteCell(ScMyCell& aCell, sal_Int32 nEqualCellCount) { AddAttribute(sAttrValueType, XML_STRING); AddAttribute(sAttrStringValue, aCell.sStringValue); + if( getDefaultVersion() >= SvtSaveOptions::ODFVER_012 ) + { + AddAttribute(XML_NAMESPACE_CALC_EXT,XML_VALUE_TYPE, XML_STRING); + } } } } diff --git a/xmloff/source/style/numehelp.cxx b/xmloff/source/style/numehelp.cxx index fcefcc6..f510bd5 100644 --- a/xmloff/source/style/numehelp.cxx +++ b/xmloff/source/style/numehelp.cxx @@ -60,7 +60,6 @@ XMLNumberFormatAttributesExportHelper::XMLNumberFormatAttributesExportHelper( pExport(&rTempExport), sStandardFormat(XML_STANDARDFORMAT), sType(XML_TYPE), - sAttrValueType(rTempExport.GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_OFFICE, GetXMLToken(XML_VALUE_TYPE))), sAttrValue(rTempExport.GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_OFFICE, GetXMLToken(XML_VALUE))), sAttrDateValue(rTempExport.GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_OFFICE, GetXMLToken(XML_DATE_VALUE))), sAttrTimeValue(rTempExport.GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_OFFICE, GetXMLToken(XML_TIME_VALUE))), @@ -384,12 +383,13 @@ void XMLNumberFormatAttributesExportHelper::WriteAttributes( const sal_Int16 nTypeKey, const double& rValue, const OUString& rCurrency, - sal_Bool bExportValue) + sal_Bool bExportValue, sal_uInt16 nNamespace) { if (!pExport) return; sal_Bool bWasSetTypeAttribute = sal_False; + OUString sAttrValType = pExport->GetNamespaceMap().GetQNameByKey( nNamespace, GetXMLToken(XML_VALUE_TYPE)); switch(nTypeKey & ~util::NumberFormat::DEFINED) { case 0: @@ -399,7 +399,7 @@ void XMLNumberFormatAttributesExportHelper::WriteAttributes( { if (!bWasSetTypeAttribute) { - pExport->AddAttribute(sAttrValueType, XML_FLOAT); + pExport->AddAttribute(sAttrValType, XML_FLOAT); bWasSetTypeAttribute = sal_True; } } // No Break @@ -407,7 +407,7 @@ void XMLNumberFormatAttributesExportHelper::WriteAttributes( { if (!bWasSetTypeAttribute) { - pExport->AddAttribute(sAttrValueType, XML_PERCENTAGE); + pExport->AddAttribute(sAttrValType, XML_PERCENTAGE); bWasSetTypeAttribute = sal_True; } } // No Break @@ -415,7 +415,7 @@ void XMLNumberFormatAttributesExportHelper::WriteAttributes( { if (!bWasSetTypeAttribute) { - pExport->AddAttribute(sAttrValueType, XML_CURRENCY); + pExport->AddAttribute(sAttrValType, XML_CURRENCY); if (!rCurrency.isEmpty()) pExport->AddAttribute(sAttrCurrency, rCurrency); bWasSetTypeAttribute = sal_True; @@ -435,7 +435,7 @@ void XMLNumberFormatAttributesExportHelper::WriteAttributes( { if (!bWasSetTypeAttribute) { - pExport->AddAttribute(sAttrValueType, XML_DATE); + pExport->AddAttribute(sAttrValType, XML_DATE); bWasSetTypeAttribute = sal_True; } if (bExportValue) @@ -453,7 +453,7 @@ void XMLNumberFormatAttributesExportHelper::WriteAttributes( { if (!bWasSetTypeAttribute) { - pExport->AddAttribute(sAttrValueType, XML_TIME); + pExport->AddAttribute(sAttrValType, XML_TIME); bWasSetTypeAttribute = sal_True; } if (bExportValue) @@ -468,7 +468,7 @@ void XMLNumberFormatAttributesExportHelper::WriteAttributes( { if (!bWasSetTypeAttribute) { - pExport->AddAttribute(sAttrValueType, XML_BOOLEAN); + pExport->AddAttribute(sAttrValType, XML_BOOLEAN); bWasSetTypeAttribute = sal_True; } if (bExportValue) @@ -501,7 +501,7 @@ void XMLNumberFormatAttributesExportHelper::WriteAttributes( { if (!bWasSetTypeAttribute) { - pExport->AddAttribute(sAttrValueType, XML_FLOAT); + pExport->AddAttribute(sAttrValType, XML_FLOAT); bWasSetTypeAttribute = sal_True; if (bExportValue) { @@ -517,14 +517,14 @@ void XMLNumberFormatAttributesExportHelper::WriteAttributes( } void XMLNumberFormatAttributesExportHelper::SetNumberFormatAttributes( - const sal_Int32 nNumberFormat, const double& rValue, sal_Bool bExportValue) + const sal_Int32 nNumberFormat, const double& rValue, sal_Bool bExportValue, sal_uInt16 nNamespace) { if (pExport) { bool bIsStandard; OUString sCurrency; sal_Int16 nTypeKey = GetCellType(nNumberFormat, sCurrency, bIsStandard); - WriteAttributes(nTypeKey, rValue, sCurrency, bExportValue); + WriteAttributes(nTypeKey, rValue, sCurrency, bExportValue, nNamespace); } else { OSL_FAIL("no SvXMLExport given"); @@ -533,12 +533,13 @@ void XMLNumberFormatAttributesExportHelper::SetNumberFormatAttributes( void XMLNumberFormatAttributesExportHelper::SetNumberFormatAttributes( const OUString& rValue, const OUString& rCharacters, - sal_Bool bExportValue, sal_Bool bExportTypeAttribute) + sal_Bool bExportValue, sal_Bool bExportTypeAttribute, + sal_uInt16 nNamespace) { if (pExport) { if (bExportTypeAttribute) - pExport->AddAttribute(sAttrValueType, XML_STRING); + pExport->AddAttribute(nNamespace, XML_VALUE_TYPE, XML_STRING); if (bExportValue && !rValue.isEmpty() && (rValue != rCharacters)) pExport->AddAttribute(sAttrStringValue, rValue); } commit 6bec369008596f74dfa49721f52d16a684fc4581 Author: Markus Mohrhard <[email protected]> Date: Wed Apr 24 15:19:35 2013 +0200 fix indentation Change-Id: Ie70d580cd2a4ad88751672fd257c825b9813c86e diff --git a/sc/source/filter/xml/xmlexprt.cxx b/sc/source/filter/xml/xmlexprt.cxx index 2248f90..8b86e60 100644 --- a/sc/source/filter/xml/xmlexprt.cxx +++ b/sc/source/filter/xml/xmlexprt.cxx @@ -2870,90 +2870,88 @@ void ScXMLExport::WriteCell(ScMyCell& aCell, sal_Int32 nEqualCellCount) bool bIsEmpty(false); switch (aCell.nType) { - case table::CellContentType_EMPTY : - { - bIsEmpty = true; - } - break; - case table::CellContentType_VALUE : - { - if (!aCell.bHasDoubleValue) + case table::CellContentType_EMPTY : { - aCell.fValue = pDoc->GetValue( aCellPos ); - aCell.bHasDoubleValue = true; + bIsEmpty = true; } - GetNumberFormatAttributesExportHelper()->SetNumberFormatAttributes( - aCell.nNumberFormat, aCell.fValue); - } - break; - case table::CellContentType_TEXT : - { - if (GetCellText(aCell, aCellPos)) + break; + case table::CellContentType_VALUE : { - OUString sFormula(lcl_GetRawString(pDoc, aCellPos)); + if (!aCell.bHasDoubleValue) + { + aCell.fValue = pDoc->GetValue( aCellPos ); + aCell.bHasDoubleValue = true; + } GetNumberFormatAttributesExportHelper()->SetNumberFormatAttributes( - sFormula, aCell.sStringValue, true, true); + aCell.nNumberFormat, aCell.fValue); } - } - break; - case table::CellContentType_FORMULA : - { - ScRefCellValue aCellVal; - aCellVal.assign(*pDoc, aCellPos); - if (aCellVal.meType == CELLTYPE_FORMULA) + break; + case table::CellContentType_TEXT : { - OUStringBuffer sFormula; - ScFormulaCell* pFormulaCell = aCellVal.mpFormula; - if (!bIsMatrix || (bIsMatrix && bIsFirstMatrixCell)) + if (GetCellText(aCell, aCellPos)) { - const formula::FormulaGrammar::Grammar eGrammar = pDoc->GetStorageGrammar(); - sal_uInt16 nNamespacePrefix = (eGrammar == formula::FormulaGrammar::GRAM_ODFF ? XML_NAMESPACE_OF : XML_NAMESPACE_OOOC); - pFormulaCell->GetFormula(sFormula, eGrammar); - OUString sOUFormula(sFormula.makeStringAndClear()); - if (!bIsMatrix) - { - AddAttribute(sAttrFormula, GetNamespaceMap().GetQNameByKey( nNamespacePrefix, sOUFormula, false )); - } - else - { - AddAttribute(sAttrFormula, GetNamespaceMap().GetQNameByKey( nNamespacePrefix, sOUFormula.copy(1, sOUFormula.getLength() - 2), false )); - } + OUString sFormula(lcl_GetRawString(pDoc, aCellPos)); + GetNumberFormatAttributesExportHelper()->SetNumberFormatAttributes( + sFormula, aCell.sStringValue, true, true); } - if (pFormulaCell->IsValue()) + } + break; + case table::CellContentType_FORMULA : + { + ScRefCellValue aCellVal; + aCellVal.assign(*pDoc, aCellPos); + if (aCellVal.meType == CELLTYPE_FORMULA) { - bool bIsStandard; - OUString sCurrency; - GetNumberFormatAttributesExportHelper()->GetCellType(aCell.nNumberFormat, sCurrency, bIsStandard); - if (bIsStandard) + OUStringBuffer sFormula; + ScFormulaCell* pFormulaCell = aCellVal.mpFormula; + if (!bIsMatrix || (bIsMatrix && bIsFirstMatrixCell)) { - if (pDoc) - GetNumberFormatAttributesExportHelper()->SetNumberFormatAttributes( - pFormulaCell->GetStandardFormat(*pDoc->GetFormatTable(), 0), - pDoc->GetValue( aCellPos )); + const formula::FormulaGrammar::Grammar eGrammar = pDoc->GetStorageGrammar(); + sal_uInt16 nNamespacePrefix = (eGrammar == formula::FormulaGrammar::GRAM_ODFF ? XML_NAMESPACE_OF : XML_NAMESPACE_OOOC); + pFormulaCell->GetFormula(sFormula, eGrammar); + OUString sOUFormula(sFormula.makeStringAndClear()); + if (!bIsMatrix) + { + AddAttribute(sAttrFormula, GetNamespaceMap().GetQNameByKey( nNamespacePrefix, sOUFormula, false )); + } + else + { + AddAttribute(sAttrFormula, GetNamespaceMap().GetQNameByKey( nNamespacePrefix, sOUFormula.copy(1, sOUFormula.getLength() - 2), false )); + } } - else + if (pFormulaCell->IsValue()) { - if (pDoc) - GetNumberFormatAttributesExportHelper()->SetNumberFormatAttributes( - aCell.nNumberFormat, pDoc->GetValue( aCellPos )); - } - } - else - { - if (GetCellText(aCell, aCellPos)) - if (!aCell.sStringValue.isEmpty()) + bool bIsStandard; + OUString sCurrency; + GetNumberFormatAttributesExportHelper()->GetCellType(aCell.nNumberFormat, sCurrency, bIsStandard); + if (bIsStandard) + { + if (pDoc) + GetNumberFormatAttributesExportHelper()->SetNumberFormatAttributes( + pFormulaCell->GetStandardFormat(*pDoc->GetFormatTable(), 0), + pDoc->GetValue( aCellPos )); + } + else { - AddAttribute(sAttrValueType, XML_STRING); - AddAttribute(sAttrStringValue, aCell.sStringValue); + if (pDoc) + GetNumberFormatAttributesExportHelper()->SetNumberFormatAttributes( + aCell.nNumberFormat, pDoc->GetValue( aCellPos )); } + } + else + { + if (GetCellText(aCell, aCellPos)) + if (!aCell.sStringValue.isEmpty()) + { + AddAttribute(sAttrValueType, XML_STRING); + AddAttribute(sAttrStringValue, aCell.sStringValue); + } + } } } - } - break; + break; default: - { - // added to avoid warnings - } + break; } OUString* pCellString(&sElemCell); if (aCell.bIsCovered) _______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
