summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBalazs Varga <balazs.varga.extern@allotropia.de>2024-12-27 10:57:10 +0100
committerBalazs Varga <balazs.varga.extern@allotropia.de>2024-12-27 17:07:31 +0100
commit8b492a1f3057d2b6c3daed7405000d0270ea3dd9 (patch)
treefa6c734a3034068ffad66c492afb37b4f412e528
parente47aebcec5a0103f8ed836f1bcba50c5f198f47c (diff)
tdf#164417 ooxml export: fix autofilter wrong attribute order
According to ooxml standard, x:filter attributes are always before x:dateGroupItem. Regression from: eea523b686b27b4807ab21b62805ce9fbddf74ef Change-Id: Ibfcbba8ba88162203ab662312347fb49cc836083 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/179440 Reviewed-by: Balazs Varga <balazs.varga.extern@allotropia.de> Tested-by: Jenkins
-rw-r--r--sc/qa/unit/data/xlsx/tdf164417.xlsxbin0 -> 6994 bytes
-rw-r--r--sc/qa/unit/subsequent_export_test4.cxx15
-rw-r--r--sc/source/filter/excel/excrecds.cxx43
-rw-r--r--sc/source/filter/inc/excrecds.hxx3
4 files changed, 39 insertions, 22 deletions
diff --git a/sc/qa/unit/data/xlsx/tdf164417.xlsx b/sc/qa/unit/data/xlsx/tdf164417.xlsx
new file mode 100644
index 000000000000..aa43214b0227
--- /dev/null
+++ b/sc/qa/unit/data/xlsx/tdf164417.xlsx
Binary files differ
diff --git a/sc/qa/unit/subsequent_export_test4.cxx b/sc/qa/unit/subsequent_export_test4.cxx
index fae430bbe6f1..276201b79bb6 100644
--- a/sc/qa/unit/subsequent_export_test4.cxx
+++ b/sc/qa/unit/subsequent_export_test4.cxx
@@ -2113,6 +2113,21 @@ CPPUNIT_TEST_FIXTURE(ScExportTest4, testSheetProtections)
verify();
}
+CPPUNIT_TEST_FIXTURE(ScExportTest4, testTdf164417)
+{
+ createScDoc("xlsx/tdf164417.xlsx");
+
+ save(u"Calc Office Open XML"_ustr);
+
+ xmlDocUniquePtr pSheet1 = parseExport(u"xl/worksheets/sheet1.xml"_ustr);
+ CPPUNIT_ASSERT(pSheet1);
+
+ CPPUNIT_ASSERT_EQUAL(
+ 0, getXPathPosition(pSheet1, "//x:autoFilter/x:filterColumn/x:filters", "filter"));
+ CPPUNIT_ASSERT_EQUAL(
+ 1, getXPathPosition(pSheet1, "//x:autoFilter/x:filterColumn/x:filters", "dateGroupItem"));
+}
+
CPPUNIT_PLUGIN_IMPLEMENT();
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/filter/excel/excrecds.cxx b/sc/source/filter/excel/excrecds.cxx
index f9e596142473..b47c7ada1834 100644
--- a/sc/source/filter/excel/excrecds.cxx
+++ b/sc/source/filter/excel/excrecds.cxx
@@ -790,8 +790,10 @@ void XclExpAutofilter::AddMultiValueEntry( const ScQueryEntry& rEntry )
{
if( rItem.maString.isEmpty() )
bHasBlankValue = true;
+ else if (rItem.meType == ScQueryEntry::ByDate)
+ maDateValues.push_back(rItem.maString.getString());
else
- maMultiValues.push_back(std::make_pair(rItem.maString.getString(), rItem.meType == ScQueryEntry::ByDate));
+ maMultiValues.push_back(rItem.maString.getString());
}
}
@@ -891,32 +893,31 @@ void XclExpAutofilter::SaveXml( XclExpXmlStream& rStrm )
else
rWorksheet->startElement(XML_filters);
+ // CT_Filters
for (const auto& rMultiValue : maMultiValues)
{
- if( !rMultiValue.second )
- {
- rWorksheet->singleElement(XML_filter, XML_val, rMultiValue.first);
- }
- else
+ rWorksheet->singleElement(XML_filter, XML_val, rMultiValue);
+ }
+ // CT_DateGroupItems
+ for (const auto& rDateValue : maDateValues)
+ {
+ OString aStr = OUStringToOString(rDateValue, RTL_TEXTENCODING_UTF8);
+ rtl::Reference<sax_fastparser::FastAttributeList> pAttrList = sax_fastparser::FastSerializerHelper::createAttrList();
+ sal_Int32 aDateGroup[3] = { XML_year, XML_month, XML_day };
+ sal_Int32 idx = 0;
+ for (size_t i = 0; idx >= 0 && i < 3; i++)
{
- OString aStr = OUStringToOString(rMultiValue.first, RTL_TEXTENCODING_UTF8);
- rtl::Reference<sax_fastparser::FastAttributeList> pAttrList = sax_fastparser::FastSerializerHelper::createAttrList();
- sal_Int32 aDateGroup[3] = { XML_year, XML_month, XML_day };
- sal_Int32 idx = 0;
- for (size_t i = 0; idx >= 0 && i < 3; i++)
+ OString kw = aStr.getToken(0, '-', idx);
+ kw = kw.trim();
+ if (!kw.isEmpty())
{
- OString kw = aStr.getToken(0, '-', idx);
- kw = kw.trim();
- if (!kw.isEmpty())
- {
- pAttrList->add(aDateGroup[i], kw);
- }
+ pAttrList->add(aDateGroup[i], kw);
}
- // TODO: date filter can only handle YYYY-MM-DD date formats, so XML_dateTimeGrouping value
- // will be "day" as default, until date filter cannot handle HH:MM:SS.
- pAttrList->add(XML_dateTimeGrouping, "day");
- rWorksheet->singleElement(XML_dateGroupItem, pAttrList);
}
+ // TODO: date filter can only handle YYYY-MM-DD date formats, so XML_dateTimeGrouping value
+ // will be "day" as default, until date filter cannot handle HH:MM:SS.
+ pAttrList->add(XML_dateTimeGrouping, "day");
+ rWorksheet->singleElement(XML_dateGroupItem, pAttrList);
}
rWorksheet->endElement(XML_filters);
}
diff --git a/sc/source/filter/inc/excrecds.hxx b/sc/source/filter/inc/excrecds.hxx
index 629ddfd18b5a..11035354bd45 100644
--- a/sc/source/filter/inc/excrecds.hxx
+++ b/sc/source/filter/inc/excrecds.hxx
@@ -374,7 +374,8 @@ private:
sal_uInt16 nFlags;
bool bHasBlankValue;
ExcFilterCondition aCond[ 2 ];
- std::vector<std::pair<OUString, bool>> maMultiValues; // first->values, second->bDateFormat
+ std::vector<OUString> maMultiValues; // CT_Filter values
+ std::vector<OUString> maDateValues; // CT_DateGroupItem values
std::vector<std::pair<::Color, bool>> maColorValues; // first->Color, second->bIsBackgroundColor (vs. TextColor)
bool AddCondition( ScQueryConnect eConn, sal_uInt8 nType,