From fcd96df8f648439ea191d8c2070e8b21ff0b1001 Mon Sep 17 00:00:00 2001 From: Tibor Nagy Date: Wed, 6 Jan 2021 12:23:32 +0100 Subject: tdf#113013 XLSX import: fix "Formula is" type conditional formatting MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit rule when the formula contains a reference to another worksheet. Change-Id: I873fad97a88df64e885fef20d4259ef6bfeaa06b Reviewed-on: https://gerrit.libreoffice.org/c/core/+/108850 Tested-by: Jenkins Tested-by: László Németh Reviewed-by: László Németh --- sc/qa/unit/data/xlsx/tdf113013.xlsx | Bin 0 -> 9980 bytes sc/qa/unit/subsequent_filters-test.cxx | 26 ++++++++++++++++++++++++++ sc/source/filter/oox/extlstcontext.cxx | 13 +++++++++---- 3 files changed, 35 insertions(+), 4 deletions(-) create mode 100644 sc/qa/unit/data/xlsx/tdf113013.xlsx (limited to 'sc') diff --git a/sc/qa/unit/data/xlsx/tdf113013.xlsx b/sc/qa/unit/data/xlsx/tdf113013.xlsx new file mode 100644 index 000000000000..25e6276e7fbb Binary files /dev/null and b/sc/qa/unit/data/xlsx/tdf113013.xlsx differ diff --git a/sc/qa/unit/subsequent_filters-test.cxx b/sc/qa/unit/subsequent_filters-test.cxx index 9470f869bcf4..dea5fa845d80 100644 --- a/sc/qa/unit/subsequent_filters-test.cxx +++ b/sc/qa/unit/subsequent_filters-test.cxx @@ -107,6 +107,7 @@ public: virtual void tearDown() override; //ods, xls, xlsx filter tests + void testCondFormatFormulaIsXLSX(); void testCondFormatBeginsAndEndsWithXLSX(); void testExtCondFormatXLSX(); void testUpdateCircleInMergedCellODS(); @@ -300,6 +301,7 @@ public: void testDeleteCirclesInRowAndCol(); CPPUNIT_TEST_SUITE(ScFiltersTest); + CPPUNIT_TEST(testCondFormatFormulaIsXLSX); CPPUNIT_TEST(testCondFormatBeginsAndEndsWithXLSX); CPPUNIT_TEST(testExtCondFormatXLSX); CPPUNIT_TEST(testUpdateCircleInMergedCellODS); @@ -537,6 +539,30 @@ void testRangeNameImpl(const ScDocument& rDoc) } +void ScFiltersTest::testCondFormatFormulaIsXLSX() +{ + ScDocShellRef xDocSh = loadDoc(u"tdf113013.", FORMAT_XLSX); + CPPUNIT_ASSERT_MESSAGE("Failed to load tdf113013.xlsx", xDocSh.is()); + + ScDocument& rDoc = xDocSh->GetDocument(); + + // "Formula is" condition + ScConditionalFormat* pFormatB1 = rDoc.GetCondFormat(1, 0, 0); + CPPUNIT_ASSERT(pFormatB1); + ScConditionalFormat* pFormatA2 = rDoc.GetCondFormat(0, 1, 0); + CPPUNIT_ASSERT(pFormatA2); + + ScRefCellValue aCellB1(rDoc, ScAddress(1, 0, 0)); + OUString aCellStyleB1 = pFormatB1->GetCellStyle(aCellB1, ScAddress(1, 0, 0)); + CPPUNIT_ASSERT(!aCellStyleB1.isEmpty()); + + ScRefCellValue aCellA2(rDoc, ScAddress(0, 1, 0)); + OUString aCellStyleA2 = pFormatA2->GetCellStyle(aCellA2, ScAddress(0, 1, 0)); + CPPUNIT_ASSERT(!aCellStyleA2.isEmpty()); + + xDocSh->DoClose(); +} + void ScFiltersTest::testCondFormatBeginsAndEndsWithXLSX() { ScDocShellRef xDocSh = loadDoc(u"tdf120749.", FORMAT_XLSX); diff --git a/sc/source/filter/oox/extlstcontext.cxx b/sc/source/filter/oox/extlstcontext.cxx index 53cd7b385100..fda1a0449e5e 100644 --- a/sc/source/filter/oox/extlstcontext.cxx +++ b/sc/source/filter/oox/extlstcontext.cxx @@ -153,26 +153,31 @@ ContextHandlerRef ExtConditionalFormattingContext::onCreateContext(sal_Int32 nEl eOperator = CondFormatBuffer::convertToInternalOperator(aToken); return this; } - else if(aType == "containsText") + else if (aType == "containsText") { eOperator = ScConditionMode::ContainsText; return this; } - else if(aType == "notContainsText") + else if (aType == "notContainsText") { eOperator = ScConditionMode::NotContainsText; return this; } - else if(aType == "beginsWith") + else if (aType == "beginsWith") { eOperator = ScConditionMode::BeginsWith; return this; } - else if(aType == "endsWith") + else if (aType == "endsWith") { eOperator = ScConditionMode::EndsWith; return this; } + else if (aType == "expression") + { + eOperator = ScConditionMode::Direct; + return this; + } else { SAL_WARN("sc", "unhandled XLS14_TOKEN(cfRule) with type: " << aType); -- cgit