diff options
-rw-r--r-- | sc/qa/unit/data/ods/tdf142578.ods | bin | 0 -> 10954 bytes | |||
-rw-r--r-- | sc/qa/unit/subsequent_export_test2.cxx | 41 | ||||
-rw-r--r-- | sc/source/filter/excel/xestyle.cxx | 15 |
3 files changed, 48 insertions, 8 deletions
diff --git a/sc/qa/unit/data/ods/tdf142578.ods b/sc/qa/unit/data/ods/tdf142578.ods Binary files differnew file mode 100644 index 000000000000..0fb6e07d5e4b --- /dev/null +++ b/sc/qa/unit/data/ods/tdf142578.ods diff --git a/sc/qa/unit/subsequent_export_test2.cxx b/sc/qa/unit/subsequent_export_test2.cxx index 1ca736fe07ef..0f62be048b4c 100644 --- a/sc/qa/unit/subsequent_export_test2.cxx +++ b/sc/qa/unit/subsequent_export_test2.cxx @@ -207,6 +207,7 @@ public: void testTdf143220XLSX(); void testTdf142264ManyChartsToXLSX(); void testTdf143929MultiColumnToODS(); + void testTdf142578(); CPPUNIT_TEST_SUITE(ScExportTest2); @@ -314,6 +315,7 @@ public: CPPUNIT_TEST(testTdf143220XLSX); CPPUNIT_TEST(testTdf142264ManyChartsToXLSX); CPPUNIT_TEST(testTdf143929MultiColumnToODS); + CPPUNIT_TEST(testTdf142578); CPPUNIT_TEST_SUITE_END(); @@ -2804,6 +2806,45 @@ void ScExportTest2::testTdf143929MultiColumnToODS() "column-gap"); } +void ScExportTest2::testTdf142578() +{ + ScDocShellRef xDocSh = loadDoc(u"tdf142578.", FORMAT_ODS); + CPPUNIT_ASSERT(xDocSh); + + std::shared_ptr<utl::TempFile> pXPathFile + = ScBootstrapFixture::exportTo(&(*xDocSh), FORMAT_XLSX); + xmlDocUniquePtr pSheet + = XPathHelper::parseExport(pXPathFile, m_xSFactory, "xl/worksheets/sheet1.xml"); + CPPUNIT_ASSERT(pSheet); + + // Get DxfId for color filter + sal_Int32 nDxfIdColorFilter + = getXPath(pSheet, "/x:worksheet/x:autoFilter/x:filterColumn/x:colorFilter", "dxfId") + .toInt32() + + 1; + + // Get DxfId for conditional formatting + sal_Int32 nDxfIdCondFormat + = getXPath(pSheet, "/x:worksheet/x:conditionalFormatting/x:cfRule", "dxfId").toInt32() + 1; + + // Ensure they are using different dxfs + CPPUNIT_ASSERT_MESSAGE("dxfID's should be different!", nDxfIdColorFilter != nDxfIdCondFormat); + + // Check colors used by these dxfs + xmlDocUniquePtr pStyles = XPathHelper::parseExport(pXPathFile, m_xSFactory, "xl/styles.xml"); + CPPUNIT_ASSERT(pStyles); + + OString sDxfColorFilterXPath("/x:styleSheet/x:dxfs/x:dxf[" + OString::number(nDxfIdColorFilter) + + "]/x:fill/x:patternFill/x:fgColor"); + assertXPath(pStyles, sDxfColorFilterXPath, "rgb", "FF81D41A"); + + OString sDxfCondFormatXPath("/x:styleSheet/x:dxfs/x:dxf[" + OString::number(nDxfIdCondFormat) + + "]/x:fill/x:patternFill/x:bgColor"); + assertXPath(pStyles, sDxfCondFormatXPath, "rgb", "FFFFCCCC"); + + xDocSh->DoClose(); +} + CPPUNIT_TEST_SUITE_REGISTRATION(ScExportTest2); CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/sc/source/filter/excel/xestyle.cxx b/sc/source/filter/excel/xestyle.cxx index 7032a2667a5b..e7260ecf56c1 100644 --- a/sc/source/filter/excel/xestyle.cxx +++ b/sc/source/filter/excel/xestyle.cxx @@ -3054,8 +3054,7 @@ XclExpDxfs::XclExpDxfs( const XclExpRoot& rRoot ) xFormatter->FillKeywordTableForExcel( *mpKeywordTable ); SCTAB nTables = rRoot.GetDoc().GetTableCount(); - sal_Int32 nColorIndex = 0; - sal_Int32 nCondFormattingIndex = 0; + sal_Int32 nDxfId = 0; for(SCTAB nTab = 0; nTab < nTables; ++nTab) { // Color filters @@ -3074,21 +3073,21 @@ XclExpDxfs::XclExpDxfs( const XclExpRoot& rRoot ) // Does not matter it is text color or cell background color for (auto& rColor : aFilterEntries.getBackgroundColors()) { - if (!maColorToDxfId.emplace(rColor, nColorIndex).second) + if (!maColorToDxfId.emplace(rColor, nDxfId).second) continue; std::unique_ptr<XclExpCellArea> pExpCellArea(new XclExpCellArea(rColor, 0)); maDxf.push_back(std::make_unique<XclExpDxf>(rRoot, std::move(pExpCellArea))); - nColorIndex++; + nDxfId++; } for (auto& rColor : aFilterEntries.getTextColors()) { - if (!maColorToDxfId.emplace(rColor, nColorIndex).second) + if (!maColorToDxfId.emplace(rColor, nDxfId).second) continue; std::unique_ptr<XclExpCellArea> pExpCellArea(new XclExpCellArea(rColor, 0)); maDxf.push_back(std::make_unique<XclExpDxf>(rRoot, std::move(pExpCellArea))); - nColorIndex++; + nDxfId++; } } } @@ -3122,7 +3121,7 @@ XclExpDxfs::XclExpDxfs( const XclExpRoot& rRoot ) aStyleName = pEntry->GetStyleName(); } - if (maStyleNameToDxfId.emplace(aStyleName, nCondFormattingIndex).second) + if (maStyleNameToDxfId.emplace(aStyleName, nDxfId).second) { SfxStyleSheetBase* pStyle = rRoot.GetDoc().GetStyleSheetPool()->Find(aStyleName, SfxStyleFamily::Para); if(!pStyle) @@ -3167,7 +3166,7 @@ XclExpDxfs::XclExpDxfs( const XclExpRoot& rRoot ) maDxf.push_back(std::make_unique<XclExpDxf>( rRoot, std::move(pAlign), std::move(pBorder), std::move(pFont), std::move(pNumFormat), std::move(pCellProt), std::move(pColor) )); - ++nCondFormattingIndex; + ++nDxfId; } } |