sc/qa/unit/data/xlsx/autofilternamedrange.xlsx |binary sc/qa/unit/subsequent_filters-test.cxx | 22 ++++++++++++++++++++++ sc/source/filter/inc/workbookhelper.hxx | 4 ++-- sc/source/filter/oox/defnamesbuffer.cxx | 11 ++++++----- sc/source/filter/oox/workbookhelper.cxx | 25 ++++++++++++++----------- 5 files changed, 44 insertions(+), 18 deletions(-)
New commits: commit f240b1c122019250a490573663929c54dabdfa7d Author: Balazs Varga <balazs.varga...@gmail.com> AuthorDate: Thu May 6 18:47:30 2021 +0200 Commit: Andras Timar <andras.ti...@collabora.com> CommitDate: Wed Feb 23 22:36:00 2022 +0100 tdf#127301 XLSX import: hide hidden named range of autofilter Create but not insert/add hidden FILTER_CRITERIA (_xlnm._FilterDatabase) to ScRangeName, because no need for them, so avoid of creating extra named ranges by autofilter re-range (shown in Sheet -> Named Ranges and Expressions -> Manage...). See also commit 3a2263a20629b0a3e9b4935dd43dc59817d0241c "mib17: #163146# XLS import: do not skip hidden names[...]". Change-Id: Ibfd86942a99b251a59394955bc890e6dbe0390f3 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/115189 Tested-by: László Németh <nem...@numbertext.org> Reviewed-by: László Németh <nem...@numbertext.org> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/130434 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com> Reviewed-by: Andras Timar <andras.ti...@collabora.com> diff --git a/sc/qa/unit/data/xlsx/autofilternamedrange.xlsx b/sc/qa/unit/data/xlsx/autofilternamedrange.xlsx new file mode 100644 index 000000000000..51490d9229ea Binary files /dev/null and b/sc/qa/unit/data/xlsx/autofilternamedrange.xlsx differ diff --git a/sc/qa/unit/subsequent_filters-test.cxx b/sc/qa/unit/subsequent_filters-test.cxx index 9ca62e64f1e3..74b844e22382 100644 --- a/sc/qa/unit/subsequent_filters-test.cxx +++ b/sc/qa/unit/subsequent_filters-test.cxx @@ -255,6 +255,7 @@ public: void testXLSDefColWidth(); void testPreviewMissingObjLink(); void testEscapedUnicodeXLSX(); + void testAutofilterNamedRangesXLSX(); CPPUNIT_TEST_SUITE(ScFiltersTest); CPPUNIT_TEST(testBooleanFormatXLSX); @@ -399,6 +400,7 @@ public: CPPUNIT_TEST(testXLSDefColWidth); CPPUNIT_TEST(testPreviewMissingObjLink); CPPUNIT_TEST(testEscapedUnicodeXLSX); + CPPUNIT_TEST(testAutofilterNamedRangesXLSX); CPPUNIT_TEST_SUITE_END(); @@ -4383,6 +4385,26 @@ void ScFiltersTest::testEscapedUnicodeXLSX() xDocSh->DoClose(); } +void ScFiltersTest::testAutofilterNamedRangesXLSX() +{ + ScDocShellRef xDocSh = loadDoc(u"autofilternamedrange.", FORMAT_XLSX); + CPPUNIT_ASSERT_MESSAGE("Failed to load autofilternamedrange.xlsx", xDocSh.is()); + + ScDocument& rDoc = xDocSh->GetDocument(); + const ScDBData* pDBData = rDoc.GetDBCollection()->GetDBNearCursor(0, 0, 0); + CPPUNIT_ASSERT(pDBData); + ScRange aRange; + pDBData->GetArea(aRange); + CPPUNIT_ASSERT_EQUAL(ScRange(0, 0, 0, 0, 3, 0), aRange); + OUString aPosStr; + // test there is no '_xlnm._FilterDatabase' named range on the filter area + const ScRangeData* pRData = rDoc.GetRangeAtBlock(aRange, &aPosStr); + CPPUNIT_ASSERT(!pRData); + CPPUNIT_ASSERT_EQUAL(OUString(), aPosStr); + + xDocSh->DoClose(); +} + ScFiltersTest::ScFiltersTest() : ScBootstrapFixture( "sc/qa/unit/data" ) { diff --git a/sc/source/filter/inc/workbookhelper.hxx b/sc/source/filter/inc/workbookhelper.hxx index 10733994a232..2040b59c3215 100644 --- a/sc/source/filter/inc/workbookhelper.hxx +++ b/sc/source/filter/inc/workbookhelper.hxx @@ -167,7 +167,7 @@ public: OUString& orName, const css::uno::Sequence< css::sheet::FormulaToken>& rTokens, sal_Int32 nIndex, - sal_Int32 nNameFlags ) const; + sal_Int32 nNameFlags, bool bHidden ) const; /** Creates and returns a defined name on-the-fly in the sheet. The name will not be buffered in the global defined names buffer. @@ -176,7 +176,7 @@ public: OUString& orName, const css::uno::Sequence< css::sheet::FormulaToken>& rTokens, sal_Int32 nIndex, - sal_Int32 nNameFlags, sal_Int32 nTab ) const; + sal_Int32 nNameFlags, sal_Int32 nTab, bool bHidden ) const; /** Creates and returns a database range on-the-fly in the Calc document. The range will not be buffered in the global table buffer. diff --git a/sc/source/filter/oox/defnamesbuffer.cxx b/sc/source/filter/oox/defnamesbuffer.cxx index 182be74080e1..8de4098e3016 100644 --- a/sc/source/filter/oox/defnamesbuffer.cxx +++ b/sc/source/filter/oox/defnamesbuffer.cxx @@ -225,16 +225,17 @@ void DefinedName::createNameObject( sal_Int32 nIndex ) using namespace ::com::sun::star::sheet::NamedRangeFlag; if( !isGlobalName() ) switch( mcBuiltinId ) { - case BIFF_DEFNAME_CRITERIA: nNameFlags = FILTER_CRITERIA; break; - case BIFF_DEFNAME_PRINTAREA: nNameFlags = PRINT_AREA; break; - case BIFF_DEFNAME_PRINTTITLES: nNameFlags = COLUMN_HEADER | ROW_HEADER; break; + case BIFF_DEFNAME_CRITERIA: + case BIFF_DEFNAME_FILTERDATABASE: nNameFlags = FILTER_CRITERIA; break; + case BIFF_DEFNAME_PRINTAREA: nNameFlags = PRINT_AREA; break; + case BIFF_DEFNAME_PRINTTITLES: nNameFlags = COLUMN_HEADER | ROW_HEADER; break; } // create the name and insert it into the document, maCalcName will be changed to the resulting name if (maModel.mnSheet >= 0) - mpScRangeData = createLocalNamedRangeObject( maCalcName, ApiTokenSequence(), nIndex, nNameFlags, maModel.mnSheet ); + mpScRangeData = createLocalNamedRangeObject( maCalcName, ApiTokenSequence(), nIndex, nNameFlags, maModel.mnSheet, maModel.mbHidden ); else - mpScRangeData = createNamedRangeObject( maCalcName, ApiTokenSequence(), nIndex, nNameFlags ); + mpScRangeData = createNamedRangeObject( maCalcName, ApiTokenSequence(), nIndex, nNameFlags, maModel.mbHidden ); mnTokenIndex = nIndex; } diff --git a/sc/source/filter/oox/workbookhelper.cxx b/sc/source/filter/oox/workbookhelper.cxx index 5cfa569894f4..6c56de1e981a 100644 --- a/sc/source/filter/oox/workbookhelper.cxx +++ b/sc/source/filter/oox/workbookhelper.cxx @@ -151,9 +151,9 @@ public: /** Returns the specified cell or page style from the Calc document. */ Reference< XStyle > getStyleObject( const OUString& rStyleName, bool bPageStyle ) const; /** Creates and returns a defined name on-the-fly in the Calc document. */ - ScRangeData* createNamedRangeObject( OUString& orName, const Sequence< FormulaToken>& rTokens, sal_Int32 nIndex, sal_Int32 nNameFlags ); + ScRangeData* createNamedRangeObject( OUString& orName, const Sequence< FormulaToken>& rTokens, sal_Int32 nIndex, sal_Int32 nNameFlags, bool bHidden ); /** Creates and returns a defined name on the-fly in the correct Calc sheet. */ - ScRangeData* createLocalNamedRangeObject( OUString& orName, const Sequence< FormulaToken>& rTokens, sal_Int32 nIndex, sal_Int32 nNameFlags, sal_Int32 nTab ); + ScRangeData* createLocalNamedRangeObject( OUString& orName, const Sequence< FormulaToken>& rTokens, sal_Int32 nIndex, sal_Int32 nNameFlags, sal_Int32 nTab, bool bHidden ); /** Creates and returns a database range on-the-fly in the Calc document. */ Reference< XDatabaseRange > createDatabaseRangeObject( OUString& orName, const ScRange& rRangeAddr ); /** Creates and returns an unnamed database range on-the-fly in the Calc document. */ @@ -352,7 +352,7 @@ Reference< XStyle > WorkbookGlobals::getStyleObject( const OUString& rStyleName, namespace { -ScRangeData* lcl_addNewByNameAndTokens( ScDocument& rDoc, ScRangeName* pNames, const OUString& rName, const Sequence<FormulaToken>& rTokens, sal_Int16 nIndex, sal_Int32 nUnoType ) +ScRangeData* lcl_addNewByNameAndTokens( ScDocument& rDoc, ScRangeName* pNames, const OUString& rName, const Sequence<FormulaToken>& rTokens, sal_Int16 nIndex, sal_Int32 nUnoType, bool bHidden ) { bool bDone = false; ScRangeData::Type nNewType = ScRangeData::Type::Name; @@ -366,6 +366,9 @@ ScRangeData* lcl_addNewByNameAndTokens( ScDocument& rDoc, ScRangeName* pNames, c pNew->GuessPosition(); if ( nIndex ) pNew->SetIndex( nIndex ); + // create but not insert hidden FILTER_CRITERIA named ranges to ScRangeName + if ( bHidden && nNewType == ScRangeData::Type::Criteria ) + return pNew; if ( pNames->insert(pNew) ) bDone = true; if (!bDone) @@ -386,7 +389,7 @@ OUString findUnusedName( const ScRangeName* pRangeName, const OUString& rSuggest } ScRangeData* WorkbookGlobals::createNamedRangeObject( - OUString& orName, const Sequence< FormulaToken>& rTokens, sal_Int32 nIndex, sal_Int32 nNameFlags ) + OUString& orName, const Sequence< FormulaToken>& rTokens, sal_Int32 nIndex, sal_Int32 nNameFlags, bool bHidden ) { // create the name and insert it into the Calc document ScRangeData* pScRangeData = nullptr; @@ -397,13 +400,13 @@ ScRangeData* WorkbookGlobals::createNamedRangeObject( // find an unused name orName = findUnusedName( pNames, orName ); // create the named range - pScRangeData = lcl_addNewByNameAndTokens( rDoc, pNames, orName, rTokens, nIndex, nNameFlags ); + pScRangeData = lcl_addNewByNameAndTokens( rDoc, pNames, orName, rTokens, nIndex, nNameFlags, bHidden ); } return pScRangeData; } ScRangeData* WorkbookGlobals::createLocalNamedRangeObject( - OUString& orName, const Sequence< FormulaToken >& rTokens, sal_Int32 nIndex, sal_Int32 nNameFlags, sal_Int32 nTab ) + OUString& orName, const Sequence< FormulaToken >& rTokens, sal_Int32 nIndex, sal_Int32 nNameFlags, sal_Int32 nTab, bool bHidden ) { // create the name and insert it into the Calc document ScRangeData* pScRangeData = nullptr; @@ -416,7 +419,7 @@ ScRangeData* WorkbookGlobals::createLocalNamedRangeObject( // find an unused name orName = findUnusedName( pNames, orName ); // create the named range - pScRangeData = lcl_addNewByNameAndTokens( rDoc, pNames, orName, rTokens, nIndex, nNameFlags ); + pScRangeData = lcl_addNewByNameAndTokens( rDoc, pNames, orName, rTokens, nIndex, nNameFlags, bHidden ); } return pScRangeData; } @@ -862,14 +865,14 @@ Reference< XStyle > WorkbookHelper::getStyleObject( const OUString& rStyleName, return mrBookGlob.getStyleObject( rStyleName, bPageStyle ); } -ScRangeData* WorkbookHelper::createNamedRangeObject( OUString& orName, const Sequence< FormulaToken>& rTokens, sal_Int32 nIndex, sal_Int32 nNameFlags ) const +ScRangeData* WorkbookHelper::createNamedRangeObject( OUString& orName, const Sequence< FormulaToken>& rTokens, sal_Int32 nIndex, sal_Int32 nNameFlags, bool bHidden ) const { - return mrBookGlob.createNamedRangeObject( orName, rTokens, nIndex, nNameFlags ); + return mrBookGlob.createNamedRangeObject( orName, rTokens, nIndex, nNameFlags, bHidden ); } -ScRangeData* WorkbookHelper::createLocalNamedRangeObject( OUString& orName, const Sequence< FormulaToken>& rTokens, sal_Int32 nIndex, sal_Int32 nNameFlags, sal_Int32 nTab ) const +ScRangeData* WorkbookHelper::createLocalNamedRangeObject( OUString& orName, const Sequence< FormulaToken>& rTokens, sal_Int32 nIndex, sal_Int32 nNameFlags, sal_Int32 nTab, bool bHidden ) const { - return mrBookGlob.createLocalNamedRangeObject( orName, rTokens, nIndex, nNameFlags, nTab ); + return mrBookGlob.createLocalNamedRangeObject( orName, rTokens, nIndex, nNameFlags, nTab, bHidden ); } Reference< XDatabaseRange > WorkbookHelper::createDatabaseRangeObject( OUString& orName, const ScRange& rRangeAddr ) const