sc/qa/unit/data/xlsx/tdf164417.xlsx |binary sc/qa/unit/subsequent_export_test4.cxx | 16 ++++++++++++ sc/source/filter/excel/excrecds.cxx | 43 ++++++++++++++++----------------- sc/source/filter/inc/excrecds.hxx | 3 +- 4 files changed, 40 insertions(+), 22 deletions(-)
New commits: commit 1ea2adc8bab592402ebd12a51c1588170b0c59bf Author: Balazs Varga <balazs.varga.ext...@allotropia.de> AuthorDate: Fri Dec 27 10:57:10 2024 +0100 Commit: Andras Timar <andras.ti...@collabora.com> CommitDate: Mon Jan 6 18:44:56 2025 +0100 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.ext...@allotropia.de> Tested-by: Jenkins Reviewed-on: https://gerrit.libreoffice.org/c/core/+/179830 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com> Reviewed-by: Andras Timar <andras.ti...@collabora.com> 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 Binary files /dev/null and b/sc/qa/unit/data/xlsx/tdf164417.xlsx differ diff --git a/sc/qa/unit/subsequent_export_test4.cxx b/sc/qa/unit/subsequent_export_test4.cxx index 9e6f997d214b..ff4bf86dc1b1 100644 --- a/sc/qa/unit/subsequent_export_test4.cxx +++ b/sc/qa/unit/subsequent_export_test4.cxx @@ -1846,6 +1846,22 @@ CPPUNIT_TEST_FIXTURE(ScExportTest4, testTdf157318) static_cast<sal_uInt16>(pDoc->GetRangeName(0)->size())); } +CPPUNIT_TEST_FIXTURE(ScExportTest4, testTdf164417) +{ + createScDoc("xlsx/tdf164417.xlsx"); + + save("Calc Office Open XML"); + + xmlDocUniquePtr pSheet1 = parseExport("xl/worksheets/sheet1.xml"); + CPPUNIT_ASSERT(pSheet1); + + CPPUNIT_ASSERT_EQUAL( + 0, getXPathPosition(pSheet1, "//x:autoFilter/x:filterColumn/x:filters"_ostr, "filter")); + CPPUNIT_ASSERT_EQUAL( + 1, + getXPathPosition(pSheet1, "//x:autoFilter/x:filterColumn/x:filters"_ostr, "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 2350e803a24d..35c33b057d66 100644 --- a/sc/source/filter/excel/excrecds.cxx +++ b/sc/source/filter/excel/excrecds.cxx @@ -788,8 +788,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()); } } @@ -889,32 +891,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 c7ab0aa96bd2..793314cab4a5 100644 --- a/sc/source/filter/inc/excrecds.hxx +++ b/sc/source/filter/inc/excrecds.hxx @@ -373,7 +373,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,