sc/qa/unit/data/xlsx/tdf157689.xlsx       |binary
 sc/qa/unit/subsequent_filters_test5.cxx   |   23 +++++++++++++++++++++++
 sc/source/filter/inc/autofilterbuffer.hxx |    2 ++
 sc/source/filter/oox/autofilterbuffer.cxx |   20 ++++++++++++--------
 4 files changed, 37 insertions(+), 8 deletions(-)

New commits:
commit 890b1e0b0cc14a40370a409927f9849fc2112b6a
Author:     Markus Mohrhard <markus.mohrh...@googlemail.com>
AuthorDate: Wed Jul 16 07:19:10 2025 +0800
Commit:     Xisco Fauli <xiscofa...@libreoffice.org>
CommitDate: Thu Aug 7 10:00:21 2025 +0200

    tdf#157689: don't use workbook DB range for importing autofilters
    
    When there was just a global anonymous DB range the import using the
    global DB range made sense. With the per-sheet anonymous DB ranges
    we can avoid this indirection and should use the range specified
    in the autofilter entry.
    
    Change-Id: Icc4879257c1f93a0977f118a8f89b6c87a5f5b52
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/187977
    Reviewed-by: Markus Mohrhard <markus.mohrh...@googlemail.com>
    Tested-by: Jenkins
    Signed-off-by: Xisco Fauli <xiscofa...@libreoffice.org>
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/188698

diff --git a/sc/qa/unit/data/xlsx/tdf157689.xlsx 
b/sc/qa/unit/data/xlsx/tdf157689.xlsx
new file mode 100644
index 000000000000..6246f25f7c7d
Binary files /dev/null and b/sc/qa/unit/data/xlsx/tdf157689.xlsx differ
diff --git a/sc/qa/unit/subsequent_filters_test5.cxx 
b/sc/qa/unit/subsequent_filters_test5.cxx
index a49945bb1032..b4765657bcbe 100644
--- a/sc/qa/unit/subsequent_filters_test5.cxx
+++ b/sc/qa/unit/subsequent_filters_test5.cxx
@@ -19,6 +19,8 @@
 #include <com/sun/star/sheet/XDatabaseRange.hpp>
 #include <com/sun/star/sheet/XSpreadsheetDocument.hpp>
 
+#include <dbdata.hxx>
+
 using namespace css;
 using namespace css::uno;
 
@@ -135,6 +137,27 @@ CPPUNIT_TEST_FIXTURE(ScFiltersTest5, 
testTdf162177_EastersundayODF14)
     assertXPath(pXmlDoc, sPath, "formula", u"of:=EASTERSUNDAY(2024)");
 }
 
+CPPUNIT_TEST_FIXTURE(ScFiltersTest5, testTdf157689)
+{
+    // testing the correct import of autofilter on multiple sheets
+    createScDoc("xlsx/tdf157689.xlsx");
+
+    ScDocument* pDoc = getScDoc();
+
+    ScDBData* pAnonDBData = pDoc->GetAnonymousDBData(0);
+    CPPUNIT_ASSERT(pAnonDBData);
+    ScRange aFilterRange;
+    pAnonDBData->GetArea(aFilterRange);
+    CPPUNIT_ASSERT_EQUAL(ScRange(0, 0, 0, 1, 3, 0), aFilterRange); // A1:B4
+    CPPUNIT_ASSERT(pAnonDBData->HasAutoFilter());
+
+    pAnonDBData = pDoc->GetAnonymousDBData(1);
+    CPPUNIT_ASSERT(pAnonDBData);
+    pAnonDBData->GetArea(aFilterRange);
+    CPPUNIT_ASSERT_EQUAL(ScRange(0, 0, 1, 1, 4, 1), aFilterRange); // A1:B5
+    CPPUNIT_ASSERT(pAnonDBData->HasAutoFilter());
+}
+
 CPPUNIT_PLUGIN_IMPLEMENT();
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/filter/inc/autofilterbuffer.hxx 
b/sc/source/filter/inc/autofilterbuffer.hxx
index 70203c36f0a8..e7e51834a2fd 100644
--- a/sc/source/filter/inc/autofilterbuffer.hxx
+++ b/sc/source/filter/inc/autofilterbuffer.hxx
@@ -243,6 +243,8 @@ public:
     void                finalizeImport( const css::uno::Reference< 
css::sheet::XDatabaseRange >& rxDatabaseRange,
                                         sal_Int16 nSheet );
 
+    css::uno::Reference< css::sheet::XDatabaseRange > 
createDatabaseObject(sal_Int16 nSheet);
+
 private:
     typedef RefVector< FilterColumn > FilterColumnVector;
 
diff --git a/sc/source/filter/oox/autofilterbuffer.cxx 
b/sc/source/filter/oox/autofilterbuffer.cxx
index dcf8da5fdc9d..233f81c5a48b 100644
--- a/sc/source/filter/oox/autofilterbuffer.cxx
+++ b/sc/source/filter/oox/autofilterbuffer.cxx
@@ -866,6 +866,14 @@ void AutoFilter::finalizeImport( const Reference< 
XDatabaseRange >& rxDatabaseRa
         OSL_FAIL("AutoFilter::finalizeImport(): cannot find matching DBData");
 }
 
+Reference< XDatabaseRange > AutoFilter::createDatabaseObject(sal_Int16 nSheet)
+{
+    ScRange aRangeCopy(maRange);
+    aRangeCopy.aStart.SetTab(nSheet);
+    aRangeCopy.aEnd.SetTab(nSheet);
+    return createUnnamedDatabaseRangeObject( maRange );
+}
+
 AutoFilterBuffer::AutoFilterBuffer( const WorkbookHelper& rHelper ) :
     WorkbookHelper( rHelper )
 {
@@ -880,17 +888,13 @@ AutoFilter& AutoFilterBuffer::createAutoFilter()
 
 void AutoFilterBuffer::finalizeImport( sal_Int16 nSheet )
 {
-    // rely on existence of the defined name '_FilterDatabase' containing the 
range address of the filtered area
-    const DefinedName* pFilterDBName = getDefinedNames().getByBuiltinId( 
BIFF_DEFNAME_FILTERDATABASE, nSheet ).get();
-    if(!pFilterDBName)
-        return;
-
-    ScRange aFilterRange;
-    if( !(pFilterDBName->getAbsoluteRange( aFilterRange ) && 
(aFilterRange.aStart.Tab() == nSheet)) )
+    if (maAutoFilters.empty()) {
         return;
+    }
 
+    std::shared_ptr<AutoFilter> xAutoFilter = maAutoFilters.front();
     // use the same name for the database range as used for the defined name 
'_FilterDatabase'
-    Reference< XDatabaseRange > xDatabaseRange = 
createUnnamedDatabaseRangeObject( aFilterRange );
+    Reference< XDatabaseRange > xDatabaseRange = 
xAutoFilter->createDatabaseObject(nSheet);
     // first, try to create an auto filter
     bool bHasAutoFilter = finalizeImport( xDatabaseRange, nSheet );
     // no success: try to create an advanced filter

Reply via email to