diff options
author | Balazs Varga <balazs.varga.extern@allotropia.de> | 2024-12-27 10:57:10 +0100 |
---|---|---|
committer | Balazs Varga <balazs.varga.extern@allotropia.de> | 2024-12-27 17:07:31 +0100 |
commit | 8b492a1f3057d2b6c3daed7405000d0270ea3dd9 (patch) | |
tree | fa6c734a3034068ffad66c492afb37b4f412e528 | |
parent | e47aebcec5a0103f8ed836f1bcba50c5f198f47c (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.xlsx | bin | 0 -> 6994 bytes | |||
-rw-r--r-- | sc/qa/unit/subsequent_export_test4.cxx | 15 | ||||
-rw-r--r-- | sc/source/filter/excel/excrecds.cxx | 43 | ||||
-rw-r--r-- | sc/source/filter/inc/excrecds.hxx | 3 |
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 Binary files differnew file mode 100644 index 000000000000..aa43214b0227 --- /dev/null +++ b/sc/qa/unit/data/xlsx/tdf164417.xlsx 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, |