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,

Reply via email to