sc/qa/unit/data/xlsx/tdf164417.xlsx    |binary
 sc/qa/unit/subsequent_export_test4.cxx |   15 +++++++++++
 sc/source/filter/excel/excrecds.cxx    |   43 ++++++++++++++++-----------------
 sc/source/filter/inc/excrecds.hxx      |    3 +-
 4 files changed, 39 insertions(+), 22 deletions(-)

New commits:
commit ad535c1b53a8ea72ee778e329d910c6495859c76
Author:     Balazs Varga <balazs.varga.ext...@allotropia.de>
AuthorDate: Fri Dec 27 10:57:10 2024 +0100
Commit:     Caolán McNamara <caolan.mcnam...@collabora.com>
CommitDate: Sat Dec 28 21:19:56 2024 +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
    (cherry picked from commit 8b492a1f3057d2b6c3daed7405000d0270ea3dd9)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/179473
    Reviewed-by: Caolán McNamara <caolan.mcnam...@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 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,

Reply via email to