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));