sc/qa/unit/data/xlsb/tdf151505.xlsb        |binary
 sc/qa/unit/subsequent_filters_test5.cxx    |   22 ++++++++++++++++++++++
 sc/source/filter/oox/autofiltercontext.cxx |    3 ++-
 sc/source/filter/oox/defnamesbuffer.cxx    |   12 +++++++++++-
 4 files changed, 35 insertions(+), 2 deletions(-)

New commits:
commit f3c432ec2304f46d58ee0dcb1a23fb20d5d8ef14
Author:     Markus Mohrhard <markus.mohrh...@googlemail.com>
AuthorDate: Thu Jul 17 09:11:18 2025 +0800
Commit:     Xisco Fauli <xiscofa...@libreoffice.org>
CommitDate: Thu Aug 7 17:55:39 2025 +0200

    tdf#151505: fix autofilter import in XLSB
    
    Change-Id: I880ba2f8ea384e092cd90d8b4fe2ad0356f6c1d8
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/187979
    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/+/188699

diff --git a/sc/qa/unit/data/xlsb/tdf151505.xlsb 
b/sc/qa/unit/data/xlsb/tdf151505.xlsb
new file mode 100644
index 000000000000..72ecfe7d8093
Binary files /dev/null and b/sc/qa/unit/data/xlsb/tdf151505.xlsb differ
diff --git a/sc/qa/unit/subsequent_filters_test5.cxx 
b/sc/qa/unit/subsequent_filters_test5.cxx
index b4765657bcbe..3cc0a534da3a 100644
--- a/sc/qa/unit/subsequent_filters_test5.cxx
+++ b/sc/qa/unit/subsequent_filters_test5.cxx
@@ -1,4 +1,5 @@
 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+
 /*
  * This file is part of the LibreOffice project.
  *
@@ -158,6 +159,27 @@ CPPUNIT_TEST_FIXTURE(ScFiltersTest5, testTdf157689)
     CPPUNIT_ASSERT(pAnonDBData->HasAutoFilter());
 }
 
+CPPUNIT_TEST_FIXTURE(ScFiltersTest5, testTdf151505)
+{
+    // testing the correct import of autofilter from XLSB
+    createScDoc("xlsb/tdf151505.xlsb");
+
+    ScDocument* pDoc = getScDoc();
+
+    ScDBData* pAnonDBData = pDoc->GetAnonymousDBData(0);
+    CPPUNIT_ASSERT(pAnonDBData);
+    ScRange aFilterRange;
+    pAnonDBData->GetArea(aFilterRange);
+    CPPUNIT_ASSERT_EQUAL(ScRange(0, 0, 0, 1, 4, 0), aFilterRange); // A1:B5
+    CPPUNIT_ASSERT(pAnonDBData->HasAutoFilter());
+
+    // also check for the correct handling of the autofilter buttons
+    auto nFlag = pDoc->GetAttr(0, 0, 0, ATTR_MERGE_FLAG)->GetValue();
+    CPPUNIT_ASSERT(nFlag & ScMF::Auto);
+    nFlag = pDoc->GetAttr(1, 0, 0, ATTR_MERGE_FLAG)->GetValue();
+    CPPUNIT_ASSERT(nFlag & ScMF::Auto);
+}
+
 CPPUNIT_PLUGIN_IMPLEMENT();
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/filter/oox/autofiltercontext.cxx 
b/sc/source/filter/oox/autofiltercontext.cxx
index 9cdbacea4e92..919ae0a634db 100644
--- a/sc/source/filter/oox/autofiltercontext.cxx
+++ b/sc/source/filter/oox/autofiltercontext.cxx
@@ -211,7 +211,8 @@ ContextHandlerRef AutoFilterContext::onCreateRecordContext( 
sal_Int32 nRecId, Se
 
 void AutoFilterContext::onStartRecord( SequenceInputStream& rStrm )
 {
-    mrAutoFilter.importAutoFilter( rStrm, getSheetIndex() );
+    if( getCurrentElement() == BIFF12_ID_AUTOFILTER )
+        mrAutoFilter.importAutoFilter( rStrm, getSheetIndex() );
 }
 
 } // namespace oox::xls
diff --git a/sc/source/filter/oox/defnamesbuffer.cxx 
b/sc/source/filter/oox/defnamesbuffer.cxx
index c68b8fd47346..7b2ebe3edd93 100644
--- a/sc/source/filter/oox/defnamesbuffer.cxx
+++ b/sc/source/filter/oox/defnamesbuffer.cxx
@@ -271,11 +271,21 @@ bool DefinedName::isValid(
 std::unique_ptr<ScTokenArray> DefinedName::getScTokens(
         const css::uno::Sequence<css::sheet::ExternalLinkInfo>& rExternalLinks 
)
 {
+    ScAddress aReferenceAddr(0, 0, (mnCalcSheet < 0 ? 0 : mnCalcSheet));
+    ScDocument& rDoc = getScDocument();
+    if (mxFormula) {
+        SequenceInputStream aInputStrm(*mxFormula);
+        ApiTokenSequence aTokens = 
getFormulaParser().importFormula(aReferenceAddr, FormulaType::Cell, aInputStrm);
+        std::unique_ptr<ScTokenArray> pArray(new ScTokenArray(rDoc));
+        (void)ScTokenConversion::ConvertToTokenArray( rDoc, *pArray, aTokens );
+        return pArray;
+    }
+
     // mnCalcSheet < 0 means global name and results in tab deleted when
     // compiling a reference without sheet reference. For a global name it
     // doesn't really matter which sheet is the position's default sheet if the
     // reference doesn't specify any. tdf#164895
-    ScCompiler aCompiler(getScDocument(), ScAddress(0, 0, (mnCalcSheet < 0 ? 0 
: mnCalcSheet)),
+    ScCompiler aCompiler(getScDocument(), aReferenceAddr,
             formula::FormulaGrammar::GRAM_OOXML);
     aCompiler.SetExternalLinks( rExternalLinks);
     std::unique_ptr<ScTokenArray> 
pArray(aCompiler.CompileString(maModel.maFormula));

Reply via email to