sc/source/filter/excel/xecontent.cxx | 85 ++++++++++++++++++++++++++++++----- 1 file changed, 74 insertions(+), 11 deletions(-)
New commits: commit 16048ebc230880148346f02403820b7646b2649c Author: Markus Mohrhard <markus.mohrh...@googlemail.com> AuthorDate: Sun Jul 15 00:18:58 2018 +0200 Commit: Markus Mohrhard <markus.mohrh...@googlemail.com> CommitDate: Sun Jul 15 23:05:26 2018 +0200 related tdf#117816, only export cond format formula to xlsx when required Change-Id: I7523d17e9945dfbdf0c346fff8eddd40593f946a Reviewed-on: https://gerrit.libreoffice.org/57444 Tested-by: Jenkins Reviewed-by: Markus Mohrhard <markus.mohrh...@googlemail.com> diff --git a/sc/source/filter/excel/xecontent.cxx b/sc/source/filter/excel/xecontent.cxx index 4e0863d12e1b..04f3a9c0f2bd 100644 --- a/sc/source/filter/excel/xecontent.cxx +++ b/sc/source/filter/excel/xecontent.cxx @@ -937,6 +937,27 @@ bool IsTextRule(ScConditionMode eMode) return false; } +bool RequiresFormula(ScConditionMode eMode) +{ + if (IsTopBottomRule(eMode)) + return false; + else if (IsTextRule(eMode)) + return false; + + switch (eMode) + { + case ScConditionMode::NoError: + case ScConditionMode::Error: + case ScConditionMode::Duplicate: + case ScConditionMode::NotDuplicate: + return false; + default: + break; + } + + return true; +} + bool RequiresFixedFormula(ScConditionMode eMode) { switch(eMode) @@ -963,9 +984,9 @@ OString GetFixedFormula(ScConditionMode eMode, const ScAddress& rAddress, const switch (eMode) { case ScConditionMode::Error: - return ""; + return OString("ISERROR(" + aPos + ")") ; case ScConditionMode::NoError: - return ""; + return OString("NOT(ISERROR(" + aPos + "))") ; case ScConditionMode::BeginsWith: return OString("LEFT(" + aPos + ",LEN(\"" + rText + "\"))=\"" + rText + "\""); case ScConditionMode::EndsWith: @@ -1034,7 +1055,7 @@ void XclExpCFImpl::SaveXml( XclExpXmlStream& rStrm ) rWorksheet->writeEscaped(aFormula.getStr()); rWorksheet->endElement( XML_formula ); } - else if(!IsTextRule(eOperation) && !IsTopBottomRule(eOperation)) + else if(RequiresFormula(eOperation)) { rWorksheet->startElement( XML_formula, FSEND ); std::unique_ptr<ScTokenArray> pTokenArray(mrFormatEntry.CreateFlatCopiedTokenArray(0)); commit 6df45ae3a85b21d984605a6656282e5feaf8dea9 Author: Markus Mohrhard <markus.mohrh...@googlemail.com> AuthorDate: Sat Jul 14 23:56:44 2018 +0200 Commit: Markus Mohrhard <markus.mohrh...@googlemail.com> CommitDate: Sun Jul 15 23:05:15 2018 +0200 related tdf#117816, add more work arounds for MS Excel bugs Another set of cases where MS Excel needs the formula. Change-Id: I58344a540ad69ff9b8c56aa817730079bd011acd Reviewed-on: https://gerrit.libreoffice.org/57443 Tested-by: Jenkins Reviewed-by: Markus Mohrhard <markus.mohrh...@googlemail.com> diff --git a/sc/source/filter/excel/xecontent.cxx b/sc/source/filter/excel/xecontent.cxx index 6d025f022eeb..4e0863d12e1b 100644 --- a/sc/source/filter/excel/xecontent.cxx +++ b/sc/source/filter/excel/xecontent.cxx @@ -937,6 +937,50 @@ bool IsTextRule(ScConditionMode eMode) return false; } +bool RequiresFixedFormula(ScConditionMode eMode) +{ + switch(eMode) + { + case ScConditionMode::NoError: + case ScConditionMode::Error: + case ScConditionMode::BeginsWith: + case ScConditionMode::EndsWith: + case ScConditionMode::ContainsText: + case ScConditionMode::NotContainsText: + return true; + default: + break; + } + + return false; +} + +OString GetFixedFormula(ScConditionMode eMode, const ScAddress& rAddress, const OString& rText) +{ + OStringBuffer aBuffer; + OStringBuffer aPosBuffer = XclXmlUtils::ToOString(aBuffer, rAddress); + OString aPos = aPosBuffer.makeStringAndClear(); + switch (eMode) + { + case ScConditionMode::Error: + return ""; + case ScConditionMode::NoError: + return ""; + case ScConditionMode::BeginsWith: + return OString("LEFT(" + aPos + ",LEN(\"" + rText + "\"))=\"" + rText + "\""); + case ScConditionMode::EndsWith: + return OString("RIGHT(" + aPos +",LEN(\"" + rText + "\"))=\"" + rText + "\""); + case ScConditionMode::ContainsText: + return OString("NOT(ISERROR(SEARCH(\"" + rText + "\"," + aPos + ")))"); + case ScConditionMode::NotContainsText: + return OString("ISERROR(SEARCH(\"" + rText + "\"," + aPos + "))"); + default: + break; + } + + return OString(""); +} + } void XclExpCFImpl::SaveXml( XclExpXmlStream& rStrm ) @@ -982,7 +1026,15 @@ void XclExpCFImpl::SaveXml( XclExpXmlStream& rStrm ) XML_text, aText.getStr(), XML_dxfId, OString::number( GetDxfs().GetDxfId( mrFormatEntry.GetStyle() ) ).getStr(), FSEND ); - if(!IsTextRule(eOperation) && !IsTopBottomRule(eOperation)) + + if (RequiresFixedFormula(eOperation)) + { + rWorksheet->startElement( XML_formula, FSEND ); + OString aFormula = GetFixedFormula(eOperation, mrFormatEntry.GetValidSrcPos(), aText); + rWorksheet->writeEscaped(aFormula.getStr()); + rWorksheet->endElement( XML_formula ); + } + else if(!IsTextRule(eOperation) && !IsTopBottomRule(eOperation)) { rWorksheet->startElement( XML_formula, FSEND ); std::unique_ptr<ScTokenArray> pTokenArray(mrFormatEntry.CreateFlatCopiedTokenArray(0)); @@ -998,16 +1050,6 @@ void XclExpCFImpl::SaveXml( XclExpXmlStream& rStrm ) rWorksheet->endElement( XML_formula ); } } - else if (IsTextRule(eOperation)) - { - OStringBuffer aBufferOld; - OStringBuffer aBuffer = XclXmlUtils::ToOString(aBufferOld, mrFormatEntry.GetValidSrcPos()); - OString aTextTopCell = aBuffer.makeStringAndClear(); - OString aFormula = "NOT(ISERROR(SEARCH(\"" + aText + "\"," + aTextTopCell + ")))"; - rWorksheet->startElement( XML_formula, FSEND ); - rWorksheet->writeEscaped(aFormula.getStr()); - rWorksheet->endElement( XML_formula ); - } // OOXTODO: XML_extLst rWorksheet->endElement( XML_cfRule ); } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits