filter/source/config/fragments/filters/calc_MS_Excel_2007_VBA_XML.xcu | 2 filter/source/config/fragments/filters/calc_MS_Excel_2007_XML.xcu | 2 filter/source/config/fragments/filters/calc_MS_Excel_2007_XML_Template.xcu | 2 filter/source/config/fragments/filters/calc_OOXML.xcu | 4 filter/source/config/fragments/filters/calc_OOXML_Template.xcu | 4 filter/source/config/fragments/types/MS_Excel_2007_VBA_XML.xcu | 2 filter/source/config/fragments/types/MS_Excel_2007_XML.xcu | 2 filter/source/config/fragments/types/MS_Excel_2007_XML_Template.xcu | 2 filter/source/config/fragments/types/calc_OOXML.xcu | 2 filter/source/config/fragments/types/calc_OOXML_Template.xcu | 2 include/oox/core/filterdetect.hxx | 1 oox/source/core/filterdetect.cxx | 55 +++++++++- sc/qa/uitest/calc_tests7/save_readonly_with_password.py | 2 sc/qa/uitest/calc_tests8/tdf147086_do_not_save_empty_password_OOXML.py | 2 sc/qa/unit/subsequent_export_test2.cxx | 11 +- sc/source/filter/xml/xmlimprt.cxx | 2 16 files changed, 78 insertions(+), 19 deletions(-)
New commits: commit 0a0cf076a9acb83e247a2dc71fb3ef32c642169a Author: Justin Luth <[email protected]> AuthorDate: Sat Nov 29 14:00:15 2025 -0500 Commit: Justin Luth <[email protected]> CommitDate: Fri Dec 12 00:44:00 2025 +0100 tdf#165180 filter: rename XLSX filters to be less confusing This patch is basically a copy/paste of mstahl's DOCX patch LO 7.6 commit ed0476b0625c4361df5ff040a6661a9634588cea tdf#137883 filter: rename DOCX filters to be less confusing Reviewed-on: https://gerrit.libreoffice.org/c/core/+/147210 Rename misleading "Excel 2007-365" filter which corresponds to the first pre-ISO version of OOXML (ECMA-365 1st edition) and is actually very specifically for Excel 2007. Stop confusing users with standardese like "Office Open XML Spreadsheet" and instead use the name of the appliction that the format is intended for, "Excel 2010–365". Hopefully users will now pick the latter filter over the former, although obviously it hasn't been highly tested in the wild... Also, the OOXML_Spreadsheet_Template was missing EXPORT flag, so didn't show up in the Save dialog. Also, the OOXML_Spreadsheet was missing SUPPORTSSIGNING flag which (for DOCX) vmiklos said was by accident. Notes: -I made sure to use the n-dash instead of a hyphen -did a diff to verify only missing EXPORT and SUPPORTSSIGNING -followup commit will make this default, so I already changed the corresponding unit tests to use 2010 filter. make -srj1 UITest_calc_tests7 \ UITEST_TEST_NAME=save_readonly_with_password.save_readonly_with_password.test_save_to_xlsx \ SAL_USE_VCLPLUGIN=gen make -srj1 UITest_calc_tests8 \ UITEST_TEST_NAME=tdf147086_do_not_save_empty_password_OOXML.tdf147086.test_tdf147086 \ SAL_USE_VCLPLUGIN=gen Change-Id: I66d8029f28e96552c291edc532f01ec9cb695763 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/195032 Reviewed-by: Justin Luth <[email protected]> Tested-by: Jenkins diff --git a/filter/source/config/fragments/filters/calc_MS_Excel_2007_VBA_XML.xcu b/filter/source/config/fragments/filters/calc_MS_Excel_2007_VBA_XML.xcu index ffeee2c630da..776bdd25afcb 100644 --- a/filter/source/config/fragments/filters/calc_MS_Excel_2007_VBA_XML.xcu +++ b/filter/source/config/fragments/filters/calc_MS_Excel_2007_VBA_XML.xcu @@ -25,6 +25,6 @@ <prop oor:name="TemplateName"/> <prop oor:name="DocumentService"><value>com.sun.star.sheet.SpreadsheetDocument</value></prop> <prop oor:name="UIName"> - <value xml:lang="en-US">Excel 2007–365 (macro-enabled)</value> + <value xml:lang="en-US">Excel 2007 (macro-enabled)</value> </prop> </node> diff --git a/filter/source/config/fragments/filters/calc_MS_Excel_2007_XML.xcu b/filter/source/config/fragments/filters/calc_MS_Excel_2007_XML.xcu index bc0ab95e2c8a..988cbeff75ad 100644 --- a/filter/source/config/fragments/filters/calc_MS_Excel_2007_XML.xcu +++ b/filter/source/config/fragments/filters/calc_MS_Excel_2007_XML.xcu @@ -25,6 +25,6 @@ <prop oor:name="TemplateName"/> <prop oor:name="DocumentService"><value>com.sun.star.sheet.SpreadsheetDocument</value></prop> <prop oor:name="UIName"> - <value xml:lang="en-US">Excel 2007–365</value> + <value xml:lang="en-US">Excel 2007</value> </prop> </node> diff --git a/filter/source/config/fragments/filters/calc_MS_Excel_2007_XML_Template.xcu b/filter/source/config/fragments/filters/calc_MS_Excel_2007_XML_Template.xcu index 515b89152b60..119b536ea8a1 100644 --- a/filter/source/config/fragments/filters/calc_MS_Excel_2007_XML_Template.xcu +++ b/filter/source/config/fragments/filters/calc_MS_Excel_2007_XML_Template.xcu @@ -25,6 +25,6 @@ <prop oor:name="TemplateName"/> <prop oor:name="DocumentService"><value>com.sun.star.sheet.SpreadsheetDocument</value></prop> <prop oor:name="UIName"> - <value xml:lang="en-US">Excel 2007–365 Template</value> + <value xml:lang="en-US">Excel 2007 Template</value> </prop> </node> diff --git a/filter/source/config/fragments/filters/calc_OOXML.xcu b/filter/source/config/fragments/filters/calc_OOXML.xcu index 2bc0981297d9..fbd3b2abaf7c 100644 --- a/filter/source/config/fragments/filters/calc_OOXML.xcu +++ b/filter/source/config/fragments/filters/calc_OOXML.xcu @@ -16,7 +16,7 @@ * the License at http://www.apache.org/licenses/LICENSE-2.0 . --> <node oor:name="Calc Office Open XML" oor:op="replace"> - <prop oor:name="Flags"><value>IMPORT EXPORT ALIEN 3RDPARTYFILTER PREFERRED ENCRYPTION PASSWORDTOMODIFY</value></prop> + <prop oor:name="Flags"><value>IMPORT EXPORT ALIEN 3RDPARTYFILTER PREFERRED ENCRYPTION PASSWORDTOMODIFY SUPPORTSSIGNING</value></prop> <prop oor:name="UIComponent"/> <prop oor:name="FilterService"><value>com.sun.star.comp.oox.xls.ExcelFilter</value></prop> <prop oor:name="UserData"><value>OOXML</value></prop> @@ -25,6 +25,6 @@ <prop oor:name="TemplateName"/> <prop oor:name="DocumentService"><value>com.sun.star.sheet.SpreadsheetDocument</value></prop> <prop oor:name="UIName"> - <value xml:lang="en-US">Office Open XML Spreadsheet</value> + <value xml:lang="en-US">Excel 2010–365 Spreadsheet</value> </prop> </node> diff --git a/filter/source/config/fragments/filters/calc_OOXML_Template.xcu b/filter/source/config/fragments/filters/calc_OOXML_Template.xcu index b65a756088be..c6dc4732dcb8 100644 --- a/filter/source/config/fragments/filters/calc_OOXML_Template.xcu +++ b/filter/source/config/fragments/filters/calc_OOXML_Template.xcu @@ -16,7 +16,7 @@ * the License at http://www.apache.org/licenses/LICENSE-2.0 . --> <node oor:name="Calc Office Open XML Template" oor:op="replace"> - <prop oor:name="Flags"><value>IMPORT ALIEN 3RDPARTYFILTER TEMPLATE TEMPLATEPATH</value></prop> + <prop oor:name="Flags"><value>IMPORT EXPORT ALIEN 3RDPARTYFILTER TEMPLATE TEMPLATEPATH</value></prop> <prop oor:name="UIComponent"/> <prop oor:name="FilterService"><value>com.sun.star.comp.oox.xls.ExcelFilter</value></prop> <prop oor:name="UserData"><value>OOXML</value></prop> @@ -25,6 +25,6 @@ <prop oor:name="TemplateName"/> <prop oor:name="DocumentService"><value>com.sun.star.sheet.SpreadsheetDocument</value></prop> <prop oor:name="UIName"> - <value xml:lang="en-US">Office Open XML Spreadsheet Template</value> + <value xml:lang="en-US">Excel 2010–365 Template</value> </prop> </node> diff --git a/filter/source/config/fragments/types/MS_Excel_2007_VBA_XML.xcu b/filter/source/config/fragments/types/MS_Excel_2007_VBA_XML.xcu index 70c99bbf7dbd..c26dab582711 100644 --- a/filter/source/config/fragments/types/MS_Excel_2007_VBA_XML.xcu +++ b/filter/source/config/fragments/types/MS_Excel_2007_VBA_XML.xcu @@ -22,6 +22,6 @@ <prop oor:name="MediaType"><value>application/vnd.ms-excel.sheet.macroEnabled.12</value></prop> <prop oor:name="Preferred"><value>false</value></prop> <prop oor:name="PreferredFilter"><value>Calc MS Excel 2007 VBA XML</value></prop> - <prop oor:name="UIName"><value xml:lang="en-US">Microsoft Excel 2007–365 VBA XML</value></prop> + <prop oor:name="UIName"><value xml:lang="en-US">Microsoft Excel 2007 VBA XML</value></prop> <prop oor:name="ClipboardFormat"/> </node> diff --git a/filter/source/config/fragments/types/MS_Excel_2007_XML.xcu b/filter/source/config/fragments/types/MS_Excel_2007_XML.xcu index 73d2daee354c..a6c06c34a4ac 100644 --- a/filter/source/config/fragments/types/MS_Excel_2007_XML.xcu +++ b/filter/source/config/fragments/types/MS_Excel_2007_XML.xcu @@ -22,6 +22,6 @@ <prop oor:name="MediaType"><value>application/vnd.openxmlformats-officedocument.spreadsheetml.sheet</value></prop> <prop oor:name="Preferred"><value>false</value></prop> <prop oor:name="PreferredFilter"><value>Calc MS Excel 2007 XML</value></prop> - <prop oor:name="UIName"><value xml:lang="en-US">Excel 2007–365</value></prop> + <prop oor:name="UIName"><value xml:lang="en-US">Excel 2007</value></prop> <prop oor:name="ClipboardFormat"/> </node> diff --git a/filter/source/config/fragments/types/MS_Excel_2007_XML_Template.xcu b/filter/source/config/fragments/types/MS_Excel_2007_XML_Template.xcu index d0a828def722..db6849e29b25 100644 --- a/filter/source/config/fragments/types/MS_Excel_2007_XML_Template.xcu +++ b/filter/source/config/fragments/types/MS_Excel_2007_XML_Template.xcu @@ -22,6 +22,6 @@ <prop oor:name="MediaType"><value>application/vnd.openxmlformats-officedocument.spreadsheetml.template</value></prop> <prop oor:name="Preferred"><value>false</value></prop> <prop oor:name="PreferredFilter"><value>Calc MS Excel 2007 XML Template</value></prop> - <prop oor:name="UIName"><value xml:lang="en-US">Excel 2007–365 Template</value></prop> + <prop oor:name="UIName"><value xml:lang="en-US">Excel 2007 Template</value></prop> <prop oor:name="ClipboardFormat"/> </node> diff --git a/filter/source/config/fragments/types/calc_OOXML.xcu b/filter/source/config/fragments/types/calc_OOXML.xcu index 8e2b073ccc3a..2dce88af0c22 100644 --- a/filter/source/config/fragments/types/calc_OOXML.xcu +++ b/filter/source/config/fragments/types/calc_OOXML.xcu @@ -22,6 +22,6 @@ <prop oor:name="MediaType"><value>application/vnd.openxmlformats-officedocument.spreadsheetml.sheet</value></prop> <prop oor:name="Preferred"><value>true</value></prop> <prop oor:name="PreferredFilter"><value>Calc Office Open XML</value></prop> - <prop oor:name="UIName"><value xml:lang="en-US">Office Open XML Spreadsheet</value></prop> + <prop oor:name="UIName"><value xml:lang="en-US">Excel 2010–365 Spreadsheet</value></prop> <prop oor:name="ClipboardFormat"/> </node> diff --git a/filter/source/config/fragments/types/calc_OOXML_Template.xcu b/filter/source/config/fragments/types/calc_OOXML_Template.xcu index 1d002d08f143..566ce55f443b 100644 --- a/filter/source/config/fragments/types/calc_OOXML_Template.xcu +++ b/filter/source/config/fragments/types/calc_OOXML_Template.xcu @@ -22,6 +22,6 @@ <prop oor:name="MediaType"><value>application/vnd.openxmlformats-officedocument.spreadsheetml.template</value></prop> <prop oor:name="Preferred"><value>true</value></prop> <prop oor:name="PreferredFilter"><value>Calc Office Open XML Template</value></prop> - <prop oor:name="UIName"><value xml:lang="en-US">Office Open XML Spreadsheet Template</value></prop> + <prop oor:name="UIName"><value xml:lang="en-US">Excel 2010–365 Spreadsheet Template</value></prop> <prop oor:name="ClipboardFormat"/> </node> diff --git a/sc/qa/uitest/calc_tests7/save_readonly_with_password.py b/sc/qa/uitest/calc_tests7/save_readonly_with_password.py index 211060822f88..add5890cc325 100644 --- a/sc/qa/uitest/calc_tests7/save_readonly_with_password.py +++ b/sc/qa/uitest/calc_tests7/save_readonly_with_password.py @@ -29,7 +29,7 @@ class save_readonly_with_password(UITestCase): xFileName.executeAction("TYPE", mkPropertyValues({"KEYCODE":"BACKSPACE"})) xFileName.executeAction("TYPE", mkPropertyValues({"TEXT": xFilePath})) xFileTypeCombo = xSaveDialog.getChild("file_type") - select_by_text(xFileTypeCombo, "Excel 2007–365 (.xlsx)") + select_by_text(xFileTypeCombo, "Excel 2010–365 Spreadsheet (.xlsx)") xPasswordCheckButton = xSaveDialog.getChild("password") xPasswordCheckButton.executeAction("CLICK", tuple()) xOpen = xSaveDialog.getChild("open") diff --git a/sc/qa/uitest/calc_tests8/tdf147086_do_not_save_empty_password_OOXML.py b/sc/qa/uitest/calc_tests8/tdf147086_do_not_save_empty_password_OOXML.py index 85c7eb42e408..d2144c80d566 100755 --- a/sc/qa/uitest/calc_tests8/tdf147086_do_not_save_empty_password_OOXML.py +++ b/sc/qa/uitest/calc_tests8/tdf147086_do_not_save_empty_password_OOXML.py @@ -31,7 +31,7 @@ class tdf147086(UITestCase): xFileName.executeAction("TYPE", mkPropertyValues({"KEYCODE":"BACKSPACE"})) xFileName.executeAction("TYPE", mkPropertyValues({"TEXT": xFilePath})) xFileTypeCombo = xSaveDialog.getChild("file_type") - select_by_text(xFileTypeCombo, "Excel 2007–365 (.xlsx)") + select_by_text(xFileTypeCombo, "Excel 2010–365 Spreadsheet (.xlsx)") xPasswordCheckButton = xSaveDialog.getChild("password") xPasswordCheckButton.executeAction("CLICK", tuple()) xOpen = xSaveDialog.getChild("open") diff --git a/sc/source/filter/xml/xmlimprt.cxx b/sc/source/filter/xml/xmlimprt.cxx index 501deb66de35..dd4fc2e27a1d 100644 --- a/sc/source/filter/xml/xmlimprt.cxx +++ b/sc/source/filter/xml/xmlimprt.cxx @@ -1789,7 +1789,7 @@ extern "C" SAL_DLLPUBLIC_EXPORT bool TestFODSExportXLS(SvStream &rStream) uno::Sequence<beans::PropertyValue> aFilterData(comphelper::InitPropertySequence({ })); uno::Sequence<beans::PropertyValue> aDescriptor(comphelper::InitPropertySequence({ - { "FilterName", uno::Any(u"Excel 2007–365"_ustr) }, + { "FilterName", uno::Any(u"Excel 2010–365 Spreadsheet"_ustr) }, { "OutputStream", uno::Any(xOutputStream) }, { "FilterData", uno::Any(aFilterData) } })); commit ee0e7b2b78f9024bd9e2fe18c75bb0cb2dfea769 Author: Justin Luth <[email protected]> AuthorDate: Fri Dec 5 20:25:47 2025 -0500 Commit: Justin Luth <[email protected]> CommitDate: Fri Dec 12 00:43:48 2025 +0100 tdf#165180 xlsx import: detect lowestEdited > 4 as 2010+ filter WARNING: this patch instantly flips LO to importing/exporting most xlsx documents with the Excel 2010 filter. Prior to this, everything used Excel 2007 filter for import or export. xl/workbook.xml contains a fileVersion element that has a lowestEdited value (similar to DOCX's compatibilityMode). Although undocumented, lowestEdited in practice seems to mean: - 4 is Excel 2007 - 5 is Excel 2010 - 6 is (probably) Excel 2013 - 7 is Excel 2019 (probably also 2016) My Excel 2024 produced this: <fileVersion appName="xl" lastEdited="7" lowestEdited="7" rupBuild="27928"/> If there is no lowestEdited, then just use lastEdited. There apparently is no default value for lowestEdited or lastEdited (unlike compatibilityMode - which is treated as 12 when not specified). make CppunitTest_sc_subsequent_export_test2 \ CPPUNIT_TEST_NAME=testGroupShape Change-Id: I83b093279949214cbf819d0597cb923347cfb04d Reviewed-on: https://gerrit.libreoffice.org/c/core/+/195118 Reviewed-by: Justin Luth <[email protected]> Tested-by: Jenkins diff --git a/include/oox/core/filterdetect.hxx b/include/oox/core/filterdetect.hxx index 2d2b50260b95..436e91cce909 100644 --- a/include/oox/core/filterdetect.hxx +++ b/include/oox/core/filterdetect.hxx @@ -77,6 +77,7 @@ public: private: void parseSettings(const AttributeList& rAttribs); + void parseWorkbook(const AttributeList& rAttribs); void parseRelationship( const AttributeList& rAttribs ); OUString getFilterNameFromContentType( std::u16string_view rContentType, std::u16string_view rFileName ); diff --git a/oox/source/core/filterdetect.cxx b/oox/source/core/filterdetect.cxx index 8ee4fc1a179b..eb7d2182566a 100644 --- a/oox/source/core/filterdetect.cxx +++ b/oox/source/core/filterdetect.cxx @@ -98,6 +98,14 @@ void SAL_CALL FilterDetectDocHandler::startFastElement( parseSettings(aAttribs); break; + // cases for xl/workbook.xml + case XLS_TOKEN(workbook): + break; + case XLS_TOKEN(fileVersion): + if (!maContextStack.empty() && (maContextStack.back() == XLS_TOKEN(workbook))) + parseWorkbook(aAttribs); + break; + // cases for _rels/.rels case PR_TOKEN( Relationships ): break; @@ -164,6 +172,19 @@ void FilterDetectDocHandler::parseSettings(const AttributeList& rAttribs) } } +void FilterDetectDocHandler::parseWorkbook(const AttributeList& rAttribs) +{ + if (maOOXMLVariant != OOXMLVariant::ECMA_Transitional) + return; + + // tdf#165180 Remember filter when opening file as 'Office Open XML Spreadsheet' + // (fileVersion can only exist once, and lowestEdited can only be defined once - else corrupt) + // lowestEdited: 4 is 2007, 5 is 2010, 6 is 201?, 7 is 201?-2024 + const sal_Int32 nDefaultValue = rAttribs.getInteger(XML_lastEdited, 99); + if (rAttribs.getInteger(XML_lowestEdited, nDefaultValue) > 4) + maOOXMLVariant = OOXMLVariant::ISO_Transitional; // Excel 2010+ +} + void FilterDetectDocHandler::parseRelationship( const AttributeList& rAttribs ) { OUString aType = rAttribs.getStringDefaulted( XML_Type); @@ -230,14 +251,32 @@ OUString FilterDetectDocHandler::getFilterNameFromContentType( std::u16string_vi } if( rContentType == u"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml") - return u"MS Excel 2007 XML"_ustr; + { + switch (maOOXMLVariant) + { + case OOXMLVariant::ISO_Transitional: + case OOXMLVariant::ISO_Strict: // Not supported, map to ISO transitional + return u"Office Open XML Spreadsheet"_ustr; // Excel 2010+ + case OOXMLVariant::ECMA_Transitional: + return u"MS Excel 2007 XML"_ustr; + } + } if (rContentType == u"application/vnd.ms-excel.sheet.macroEnabled.main+xml") return u"MS Excel 2007 VBA XML"_ustr; if( rContentType == u"application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml" || rContentType == u"application/vnd.ms-excel.template.macroEnabled.main+xml" ) - return u"MS Excel 2007 XML Template"_ustr; + { + switch (maOOXMLVariant) + { + case OOXMLVariant::ISO_Transitional: + case OOXMLVariant::ISO_Strict: // Not supported, map to ISO transitional + return u"Office Open XML Spreadsheet Template"_ustr; // Excel 2010+ + case OOXMLVariant::ECMA_Transitional: + return u"MS Excel 2007 XML Template"_ustr; + } + } if ( rContentType == u"application/vnd.ms-excel.sheet.binary.macroEnabled.main" ) return u"MS Excel 2007 Binary"_ustr; @@ -458,6 +497,7 @@ OUString SAL_CALL FilterDetect::detect( Sequence< PropertyValue >& rMediaDescSeq aParser.registerNamespace( NMSP_officeRel ); aParser.registerNamespace( NMSP_packageContentTypes ); aParser.registerNamespace(NMSP_doc); // for W_TOKEN + aParser.registerNamespace(NMSP_xls); // for XLS_TOKEN OUString aFileName; aMediaDescriptor[utl::MediaDescriptor::PROP_URL] >>= aFileName; @@ -470,11 +510,20 @@ OUString SAL_CALL FilterDetect::detect( Sequence< PropertyValue >& rMediaDescSeq try { // Text documents can't use .rels to determine maOOXMLVariant. Use compatibilityMode - aParser.parseStream(aZipStorage, u"word/settings.xml"_ustr); + aParser.parseStream(aZipStorage, u"word/settings.xml"_ustr); } catch(const Exception&) { // not a MS Word text document, or file might not exist + try + { + // Spreadsheets distinguish maOOXMLVariant using fileVersion lowestEdited + aParser.parseStream(aZipStorage, u"xl/workbook.xml"_ustr); + } + catch(const Exception&) + { + // not a MS Excel spreadsheet document, or file might not exist + } } // Order is critical: .rels and then settings.xml must be parsed before [Content_Types] aParser.parseStream( aZipStorage, u"[Content_Types].xml"_ustr ); diff --git a/sc/qa/unit/subsequent_export_test2.cxx b/sc/qa/unit/subsequent_export_test2.cxx index 6dae813457f9..3753d531bbcf 100644 --- a/sc/qa/unit/subsequent_export_test2.cxx +++ b/sc/qa/unit/subsequent_export_test2.cxx @@ -21,6 +21,8 @@ #include <comphelper/propertyvalue.hxx> #include <unotools/syslocaleoptions.hxx> #include <formula/grammar.hxx> +#include <sfx2/docfilt.hxx> +#include <sfx2/fcontnr.hxx> #include <svl/numformat.hxx> #include <svl/zformat.hxx> #include <svx/svdograf.hxx> @@ -45,8 +47,15 @@ ScExportTest2::ScExportTest2() CPPUNIT_TEST_FIXTURE(ScExportTest2, testGroupShape) { createScDoc("xlsx/groupShape.xlsx"); - save(TestFilter::XLSX); + // tdf#165180: should be recognized as a 2010+ XLSX format when loaded (and resaved...) + SfxMedium* pMedium = getScDocShell()->GetMedium(); + SfxFilterMatcher aMatcher(u"com.sun.star.sheet.SpreadsheetDocument"_ustr); + std::shared_ptr<const SfxFilter> pFilter; + aMatcher.DetectFilter(*pMedium, pFilter); + CPPUNIT_ASSERT_EQUAL_MESSAGE("import", u"Calc Office Open XML"_ustr, pFilter->GetFilterName()); + + save(TestFilter::XLSX); xmlDocUniquePtr pDoc = parseExport(u"xl/drawings/drawing1.xml"_ustr); CPPUNIT_ASSERT(pDoc); assertXPath(pDoc, "/xdr:wsDr/xdr:twoCellAnchor/xdr:grpSp/xdr:grpSpPr");
