sc/qa/unit/data/ods/tdf140098.ods |binary sc/qa/unit/subsequent_export-test.cxx | 20 ++++++++++++++++++++ sc/source/filter/excel/excrecds.cxx | 21 +++++++++++++++++---- sc/source/filter/inc/excrecds.hxx | 1 + 4 files changed, 38 insertions(+), 4 deletions(-)
New commits: commit d942d7e47505f57fbdfd756fd47c79724b48db3f Author: Balazs Varga <[email protected]> AuthorDate: Thu Feb 11 13:22:25 2021 +0100 Commit: Gabor Kelemen <[email protected]> CommitDate: Thu Jul 1 17:12:10 2021 +0200 tdf#140098 sc ooxml: fix export of blank filter in non empty filters Export blank filter value in non empty filters, as the OOXML standard required. Change-Id: I4e1e3d8e1e2e784d1b4adc5e385f200af86d18ab Reviewed-on: https://gerrit.libreoffice.org/c/core/+/110762 Tested-by: Jenkins Reviewed-by: László Németh <[email protected]> (cherry picked from commit 66da7cd0a52532d6e73eb2cde78ca369917ab01a) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/118183 Tested-by: Gabor Kelemen <[email protected]> Reviewed-by: Gabor Kelemen <[email protected]> diff --git a/sc/qa/unit/data/ods/tdf140098.ods b/sc/qa/unit/data/ods/tdf140098.ods new file mode 100644 index 000000000000..ea7f753edfa0 Binary files /dev/null and b/sc/qa/unit/data/ods/tdf140098.ods differ diff --git a/sc/qa/unit/subsequent_export-test.cxx b/sc/qa/unit/subsequent_export-test.cxx index 9b54d779c917..9b0aa643b1b4 100644 --- a/sc/qa/unit/subsequent_export-test.cxx +++ b/sc/qa/unit/subsequent_export-test.cxx @@ -269,6 +269,7 @@ public: void testHeaderFontStyleXLSX(); void testTdf135828_Shape_Rect(); void testTdf123353(); + void testTdf140098(); void testTdf133688_precedents(); void testTdf91251_missingOverflowRoundtrip(); void testTdf137000_handle_upright(); @@ -449,6 +450,7 @@ public: CPPUNIT_TEST(testHeaderFontStyleXLSX); CPPUNIT_TEST(testTdf135828_Shape_Rect); CPPUNIT_TEST(testTdf123353); + CPPUNIT_TEST(testTdf140098); CPPUNIT_TEST(testTdf133688_precedents); CPPUNIT_TEST(testTdf91251_missingOverflowRoundtrip); CPPUNIT_TEST(testTdf137000_handle_upright); @@ -5567,6 +5569,24 @@ void ScExportTest::testTdf123353() xShell->DoClose(); } +void ScExportTest::testTdf140098() +{ + ScDocShellRef xShell = loadDoc(u"tdf140098.", FORMAT_ODS); + CPPUNIT_ASSERT(xShell.is()); + + ScDocShellRef xDocSh = saveAndReload(&(*xShell), FORMAT_XLSX); + CPPUNIT_ASSERT(xDocSh.is()); + + std::shared_ptr<utl::TempFile> pXPathFile = ScBootstrapFixture::exportTo(&(*xDocSh), FORMAT_XLSX); + + xmlDocUniquePtr pDoc = XPathHelper::parseExport(pXPathFile, m_xSFactory, "xl/worksheets/sheet1.xml"); + CPPUNIT_ASSERT(pDoc); + + assertXPath(pDoc, "/x:worksheet/x:autoFilter/x:filterColumn/x:filters", "blank", "1"); + + xShell->DoClose(); +} + void ScExportTest::testTdf133688_precedents() { // tdf#133688 Check that we do not export detective shapes. diff --git a/sc/source/filter/excel/excrecds.cxx b/sc/source/filter/excel/excrecds.cxx index c31c81dba4db..2ce8888ede68 100644 --- a/sc/source/filter/excel/excrecds.cxx +++ b/sc/source/filter/excel/excrecds.cxx @@ -620,7 +620,8 @@ XclExpAutofilter::XclExpAutofilter( const XclExpRoot& rRoot, sal_uInt16 nC ) : XclExpRoot( rRoot ), meType(FilterCondition), nCol( nC ), - nFlags( 0 ) + nFlags( 0 ), + bHasBlankValue( false ) { } @@ -704,7 +705,10 @@ bool XclExpAutofilter::AddEntry( const ScQueryEntry& rEntry ) // empty/nonempty fields if (rEntry.IsQueryByEmpty()) - bConflict = !AddCondition( rEntry.eConnect, EXC_AFTYPE_EMPTY, EXC_AFOPER_NONE, 0.0, nullptr, true ); + { + bConflict = !AddCondition(rEntry.eConnect, EXC_AFTYPE_EMPTY, EXC_AFOPER_NONE, 0.0, nullptr, true); + bHasBlankValue = true; + } else if(rEntry.IsQueryByNonEmpty()) bConflict = !AddCondition( rEntry.eConnect, EXC_AFTYPE_NOTEMPTY, EXC_AFOPER_NONE, 0.0, nullptr, true ); // other conditions @@ -782,7 +786,12 @@ void XclExpAutofilter::AddMultiValueEntry( const ScQueryEntry& rEntry ) meType = MultiValue; const ScQueryEntry::QueryItemsType& rItems = rEntry.GetQueryItems(); for (const auto& rItem : rItems) - maMultiValues.push_back( std::make_pair(rItem.maString.getString(), rItem.meType == ScQueryEntry::ByDate) ); + { + if( rItem.maString.isEmpty() ) + bHasBlankValue = true; + else + maMultiValues.push_back(std::make_pair(rItem.maString.getString(), rItem.meType == ScQueryEntry::ByDate)); + } } void XclExpAutofilter::WriteBody( XclExpStream& rStrm ) @@ -837,7 +846,11 @@ void XclExpAutofilter::SaveXml( XclExpXmlStream& rStrm ) break; case MultiValue: { - rWorksheet->startElement(XML_filters); + if( bHasBlankValue ) + rWorksheet->startElement(XML_filters, XML_blank, "1"); + else + rWorksheet->startElement(XML_filters); + for (const auto& rMultiValue : maMultiValues) { OString aStr = OUStringToOString(rMultiValue.first, RTL_TEXTENCODING_UTF8); diff --git a/sc/source/filter/inc/excrecds.hxx b/sc/source/filter/inc/excrecds.hxx index 0a4c65d34137..5501672bfda9 100644 --- a/sc/source/filter/inc/excrecds.hxx +++ b/sc/source/filter/inc/excrecds.hxx @@ -365,6 +365,7 @@ private: FilterType meType; sal_uInt16 nCol; sal_uInt16 nFlags; + bool bHasBlankValue; ExcFilterCondition aCond[ 2 ]; std::vector<std::pair<OUString, bool>> maMultiValues; // first->values, second->bDateFormat _______________________________________________ Libreoffice-commits mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
