summaryrefslogtreecommitdiff
path: root/sc
diff options
context:
space:
mode:
authorVasily Melenchuk <vasily.melenchuk@cib.de>2021-09-30 17:50:16 +0200
committerVasily Melenchuk <vasily.melenchuk@cib.de>2021-10-01 17:38:53 +0200
commitb7a425d48cb282e20059e78ad5216da833dec803 (patch)
treef752e129944307344a5f699caa351b49c1f3cf9e /sc
parent2ef26ab194b0e01edd81235e86b54da534c4555c (diff)
tdf#142578: xlsx export: use continuous numbering for dfx nodes
Since all dxf records are stored in one place it is required from color filter and conditional formatting to use continuous numbering for dxf structures to avoid id collision. Change-Id: I91146e34d462d812b480db137cda522f6db7ef8b Reviewed-on: https://gerrit.libreoffice.org/c/core/+/122915 Tested-by: Jenkins Reviewed-by: Vasily Melenchuk <vasily.melenchuk@cib.de>
Diffstat (limited to 'sc')
-rw-r--r--sc/qa/unit/data/ods/tdf142578.odsbin0 -> 10954 bytes
-rw-r--r--sc/qa/unit/subsequent_export_test2.cxx41
-rw-r--r--sc/source/filter/excel/xestyle.cxx15
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
new file mode 100644
index 000000000000..0fb6e07d5e4b
--- /dev/null
+++ b/sc/qa/unit/data/ods/tdf142578.ods
Binary files differ
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;
}
}