diff options
author | Tibor Nagy <nagy.tibor2@nisz.hu> | 2023-02-02 20:16:04 +0100 |
---|---|---|
committer | László Németh <nemeth@numbertext.org> | 2023-02-15 10:17:06 +0000 |
commit | 8c9a6abf30e9ff1ebd5647f7c271e0d64643860a (patch) | |
tree | ae1a10fb8747f9e68c49f3fd210f2dd69aff5f54 | |
parent | bfbbdab13f16adf66f1afb9e2a2a103162927ba3 (diff) |
tdf#138601 XLSX import: fix priority of conditional formatting rules
Multiple conditional formattings can intersect or have the same
range of cell with different rules. Without sorting the rules
by their priority, the cells got bad formatting, e.g. different
colors than what was set in MSO.
Change-Id: I619359877f1a3e55fc8f895d5ba6f0f4f30e07f2
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/146513
Tested-by: Jenkins
Tested-by: László Németh <nemeth@numbertext.org>
Reviewed-by: László Németh <nemeth@numbertext.org>
-rw-r--r-- | sc/qa/unit/data/xlsx/tdf138601.xlsx | bin | 0 -> 9690 bytes | |||
-rw-r--r-- | sc/qa/unit/subsequent_filters_test.cxx | 26 | ||||
-rw-r--r-- | sc/source/filter/oox/condformatbuffer.cxx | 20 |
3 files changed, 46 insertions, 0 deletions
diff --git a/sc/qa/unit/data/xlsx/tdf138601.xlsx b/sc/qa/unit/data/xlsx/tdf138601.xlsx Binary files differnew file mode 100644 index 000000000000..81107ee09c30 --- /dev/null +++ b/sc/qa/unit/data/xlsx/tdf138601.xlsx diff --git a/sc/qa/unit/subsequent_filters_test.cxx b/sc/qa/unit/subsequent_filters_test.cxx index 7749106a3883..45598beae411 100644 --- a/sc/qa/unit/subsequent_filters_test.cxx +++ b/sc/qa/unit/subsequent_filters_test.cxx @@ -78,6 +78,7 @@ public: ScFiltersTest(); //ods, xls, xlsx filter tests + void testTdf138601_CondFormatXLSX(); void testContentODS(); void testContentXLS(); void testContentXLSX(); @@ -210,6 +211,7 @@ public: void testForcepoint107(); CPPUNIT_TEST_SUITE(ScFiltersTest); + CPPUNIT_TEST(testTdf138601_CondFormatXLSX); CPPUNIT_TEST(testContentODS); CPPUNIT_TEST(testContentXLS); CPPUNIT_TEST(testContentXLSX); @@ -421,6 +423,30 @@ void testContentImpl(ScDocument& rDoc, bool bCheckMergedCells) } } +void ScFiltersTest::testTdf138601_CondFormatXLSX() +{ + createScDoc("xlsx/tdf138601.xlsx"); + + ScDocument* pDoc = getScDoc(); + ScConditionalFormat* pFormat1 = pDoc->GetCondFormat(0, 0, 0); + const ScFormatEntry* pEntry1 = pFormat1->GetEntry(0); + const ScColorScaleFormat* pColorScale1 = static_cast<const ScColorScaleFormat*>(pEntry1); + const ScColorScaleEntry* pColorScaleEntry1 = pColorScale1->GetEntry(0); + CPPUNIT_ASSERT_EQUAL(Color(255, 255, 201), pColorScaleEntry1->GetColor()); + + ScConditionalFormat* pFormat2 = pDoc->GetCondFormat(1, 0, 0); + const ScFormatEntry* pEntry2 = pFormat2->GetEntry(0); + const ScColorScaleFormat* pColorScale2 = static_cast<const ScColorScaleFormat*>(pEntry2); + const ScColorScaleEntry* pColorScaleEntry2 = pColorScale2->GetEntry(0); + CPPUNIT_ASSERT_EQUAL(Color(255, 139, 139), pColorScaleEntry2->GetColor()); + + ScConditionalFormat* pFormat3 = pDoc->GetCondFormat(0, 1, 0); + const ScFormatEntry* pEntry3 = pFormat3->GetEntry(0); + const ScColorScaleFormat* pColorScale3 = static_cast<const ScColorScaleFormat*>(pEntry3); + const ScColorScaleEntry* pColorScaleEntry3 = pColorScale3->GetEntry(0); + CPPUNIT_ASSERT_EQUAL(Color(255, 255, 201), pColorScaleEntry3->GetColor()); +} + void ScFiltersTest::testContentODS() { createScDoc("ods/universal-content.ods"); diff --git a/sc/source/filter/oox/condformatbuffer.cxx b/sc/source/filter/oox/condformatbuffer.cxx index 87b47456ab97..1abb3bf91938 100644 --- a/sc/source/filter/oox/condformatbuffer.cxx +++ b/sc/source/filter/oox/condformatbuffer.cxx @@ -1163,6 +1163,26 @@ void CondFormatBuffer::finalizeImport() ++nExtCFIndex; } + // tdf#138601 sort conditional formatting rules by their priority + if (maCondFormats.size() > 1) + { + size_t minIndex; + for (size_t i = 0; i < maCondFormats.size() - 1; ++i) + { + minIndex = i; + for (size_t j = i + 1; j < maCondFormats.size(); ++j) + { + if (maCondFormats[j]->maRules.begin()->first + < maCondFormats[minIndex]->maRules.begin()->first) + { + minIndex = j; + } + } + if (i != minIndex) + std::swap(maCondFormats[i], maCondFormats[minIndex]); + } + } + for( const auto& rxCondFormat : maCondFormats ) { if ( rxCondFormat) |