sc/inc/dbdata.hxx                      |    1 +
 sc/qa/unit/data/xlsx/tdf145057.xlsx    |binary
 sc/qa/unit/subsequent_export_test2.cxx |   15 +++++++++++++++
 sc/source/core/tool/dbdata.cxx         |   14 ++++++++++++++
 sc/source/filter/excel/xestyle.cxx     |    4 ++--
 5 files changed, 32 insertions(+), 2 deletions(-)

New commits:
commit 5de1c78ba793bd53961e5bb4ec5fe4c5b6828224
Author:     Samuel Mehrbrodt <[email protected]>
AuthorDate: Wed Dec 22 16:44:08 2021 +0100
Commit:     Xisco Fauli <[email protected]>
CommitDate: Thu Dec 23 11:04:30 2021 +0100

    tdf#145057 Fix saving color filter when multiple data ranges in sheet
    
    When mutliple data ranges existed in one sheet, only the first one was
    considered when exporting color filters.
    Consider all of them, as any could hold a color filter.
    
    Change-Id: I13ae2018057eef7ef24fc8298c814a93df24f74b
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/127328
    Tested-by: Jenkins
    Reviewed-by: Samuel Mehrbrodt <[email protected]>
    (cherry picked from commit b85e99950dc4584160512cffec303827c02f2d15)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/127259
    Reviewed-by: Xisco Fauli <[email protected]>

diff --git a/sc/inc/dbdata.hxx b/sc/inc/dbdata.hxx
index 3eda3e00898b..f12ba3fb976d 100644
--- a/sc/inc/dbdata.hxx
+++ b/sc/inc/dbdata.hxx
@@ -323,6 +323,7 @@ public:
     const ScDBData* GetDBAtArea(SCTAB nTab, SCCOL nCol1, SCROW nRow1, SCCOL 
nCol2, SCROW nRow2) const;
     ScDBData* GetDBAtArea(SCTAB nTab, SCCOL nCol1, SCROW nRow1, SCCOL nCol2, 
SCROW nRow2);
     ScDBData* GetDBNearCursor(SCCOL nCol, SCROW nRow, SCTAB nTab );
+    std::vector<ScDBData*> GetAllDBsFromTab(SCTAB nTab);
 
     void RefreshDirtyTableColumnNames();
 
diff --git a/sc/qa/unit/data/xlsx/tdf145057.xlsx 
b/sc/qa/unit/data/xlsx/tdf145057.xlsx
new file mode 100644
index 000000000000..4a2e259c119d
Binary files /dev/null and b/sc/qa/unit/data/xlsx/tdf145057.xlsx differ
diff --git a/sc/qa/unit/subsequent_export_test2.cxx 
b/sc/qa/unit/subsequent_export_test2.cxx
index a74fff7e04af..20be9da85bfb 100644
--- a/sc/qa/unit/subsequent_export_test2.cxx
+++ b/sc/qa/unit/subsequent_export_test2.cxx
@@ -146,6 +146,7 @@ public:
     void testTdf133595();
     void testTdf134769();
     void testTdf106181();
+    void testTdf145057();
     void testTdf105272();
     void testTdf118990();
     void testTdf121612();
@@ -259,6 +260,7 @@ public:
     CPPUNIT_TEST(testTdf133595);
     CPPUNIT_TEST(testTdf134769);
     CPPUNIT_TEST(testTdf106181);
+    CPPUNIT_TEST(testTdf145057);
     CPPUNIT_TEST(testTdf105272);
     CPPUNIT_TEST(testTdf118990);
     CPPUNIT_TEST(testTdf121612);
@@ -1219,6 +1221,19 @@ void ScExportTest2::testTdf106181()
     xDocSh->DoClose();
 }
 
+void ScExportTest2::testTdf145057()
+{
+    ScDocShellRef xDocSh = loadDoc(u"tdf145057.", FORMAT_XLSX);
+    CPPUNIT_ASSERT(xDocSh.is());
+    xDocSh = saveAndReload(xDocSh.get(), FORMAT_XLSX);
+
+    xmlDocUniquePtr pDoc = XPathHelper::parseExport2(*this, *xDocSh, 
m_xSFactory,
+                                                     "xl/tables/table1.xml", 
FORMAT_XLSX);
+    CPPUNIT_ASSERT(pDoc);
+
+    assertXPath(pDoc, "//x:colorFilter", "dxfId", "1");
+}
+
 void ScExportTest2::testTdf105272()
 {
     ScDocShellRef xDocSh = loadDoc(u"tdf105272.", FORMAT_XLSX);
diff --git a/sc/source/core/tool/dbdata.cxx b/sc/source/core/tool/dbdata.cxx
index e97d01972973..5842645953d5 100644
--- a/sc/source/core/tool/dbdata.cxx
+++ b/sc/source/core/tool/dbdata.cxx
@@ -1510,6 +1510,20 @@ ScDBData* ScDBCollection::GetDBNearCursor(SCCOL nCol, 
SCROW nRow, SCTAB nTab )
     return rDoc.GetAnonymousDBData(nTab);  // "unbenannt"/"unnamed" only if 
nothing else
 }
 
+std::vector<ScDBData*> ScDBCollection::GetAllDBsFromTab(SCTAB nTab)
+{
+    std::vector<ScDBData*> pTabData;
+    for (const auto& rxNamedDB : maNamedDBs)
+    {
+        if (rxNamedDB->GetTab() == nTab)
+            pTabData.emplace_back(rxNamedDB.get());
+    }
+    auto pAnonDBData = rDoc.GetAnonymousDBData(nTab);
+    if (pAnonDBData)
+        pTabData.emplace_back(pAnonDBData);
+    return pTabData;
+}
+
 bool ScDBCollection::empty() const
 {
     return maNamedDBs.empty() && maAnonDBs.empty();
diff --git a/sc/source/filter/excel/xestyle.cxx 
b/sc/source/filter/excel/xestyle.cxx
index 4f50144a335b..3898c5cad9b6 100644
--- a/sc/source/filter/excel/xestyle.cxx
+++ b/sc/source/filter/excel/xestyle.cxx
@@ -3059,8 +3059,8 @@ XclExpDxfs::XclExpDxfs( const XclExpRoot& rRoot )
     for(SCTAB nTab = 0; nTab < nTables; ++nTab)
     {
         // Color filters
-        const ScDBData* pData = 
rRoot.GetDoc().GetDBCollection()->GetDBNearCursor(0, 0, 0);
-        if (pData)
+        std::vector<ScDBData*> pDBData = 
rRoot.GetDoc().GetDBCollection()->GetAllDBsFromTab(nTab);
+        for (auto& pData : pDBData)
         {
             ScRange aRange;
             pData->GetArea(aRange);

Reply via email to