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