sc/qa/unit/data/xlsx/tdf90104.xlsx |binary sc/qa/unit/subsequent_export-test.cxx | 24 +++++++++++++++++++++++ sc/source/filter/excel/xecontent.cxx | 35 +++++++++++++++++++++++++++++++++- sc/source/filter/inc/xecontent.hxx | 1 4 files changed, 59 insertions(+), 1 deletion(-)
New commits: commit 677fe80877a4166eb4c243a6943b4e2b7e36c147 Author: Tibor Nagy <nagy.tib...@nisz.hu> AuthorDate: Tue Oct 13 15:48:31 2020 +0200 Commit: Gabor Kelemen <kelemen.gab...@nisz.hu> CommitDate: Thu Feb 25 13:48:10 2021 +0100 tdf#90104 XLSX export: fix commas in data validation list Comma was exported as list separator instead of decimal separator, messing up the data validation list by breaking integer and fractional parts of a number to two integer numbers, for example the 2-item list 1,5, 2,5 to the bad 4-item list 1, 5, 2, 5. Note: for testing with numbers, it needs to set decimal separator to comma in locale settings. Co-authored-by: Attila Szűcs (NISZ) Change-Id: I6133c402b47aab8ed9f02b412762404fc520badc Reviewed-on: https://gerrit.libreoffice.org/c/core/+/104240 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/+/111459 Tested-by: Gabor Kelemen <kelemen.gab...@nisz.hu> Reviewed-by: Gabor Kelemen <kelemen.gab...@nisz.hu> diff --git a/sc/qa/unit/data/xlsx/tdf90104.xlsx b/sc/qa/unit/data/xlsx/tdf90104.xlsx new file mode 100644 index 000000000000..ce6ed68368d6 Binary files /dev/null and b/sc/qa/unit/data/xlsx/tdf90104.xlsx differ diff --git a/sc/qa/unit/subsequent_export-test.cxx b/sc/qa/unit/subsequent_export-test.cxx index 462c63c93b42..a3b699cb9938 100644 --- a/sc/qa/unit/subsequent_export-test.cxx +++ b/sc/qa/unit/subsequent_export-test.cxx @@ -93,6 +93,7 @@ public: ScDocShellRef saveAndReloadPassword( ScDocShell*, const OUString&, const OUString&, const OUString&, SfxFilterFlags ); void test(); + void testTdf90104(); void testTdf111876(); void testPasswordExportODS(); void testTdf134332(); @@ -269,6 +270,7 @@ public: CPPUNIT_TEST_SUITE(ScExportTest); CPPUNIT_TEST(test); + CPPUNIT_TEST(testTdf90104); CPPUNIT_TEST(testTdf111876); CPPUNIT_TEST(testPasswordExportODS); CPPUNIT_TEST(testTdf134332); @@ -464,6 +466,7 @@ void ScExportTest::registerNamespaces(xmlXPathContextPtr& pXmlXPathCtx) { BAD_CAST("ContentType"), BAD_CAST("http://schemas.openxmlformats.org/package/2006/content-types";) }, { BAD_CAST("x14"), BAD_CAST("http://schemas.microsoft.com/office/spreadsheetml/2009/9/main";) }, { BAD_CAST("xm"), BAD_CAST("http://schemas.microsoft.com/office/excel/2006/main";) }, + { BAD_CAST("x12ac"), BAD_CAST("http://schemas.microsoft.com/office/spreadsheetml/2011/1/ac";) }, }; for(size_t i = 0; i < SAL_N_ELEMENTS(aNamespaces); ++i) { @@ -527,6 +530,27 @@ void ScExportTest::test() xDocSh->DoClose(); } +void ScExportTest::testTdf90104() +{ + ScDocShellRef xShell = loadDoc("tdf90104.", FORMAT_XLSX); + 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); + + assertXPathContent(pDoc, "/x:worksheet/x:dataValidations/x:dataValidation/mc:AlternateContent" + "/mc:Choice/x12ac:list", "1,\"2,3\",4,\"5,6\""); + assertXPathContent(pDoc, "/x:worksheet/x:dataValidations/x:dataValidation/mc:AlternateContent" + "/mc:Fallback/x:formula1", "\"1,2,3,4,5,6\""); +} + void ScExportTest::testTdf111876() { // Document with relative path hyperlink diff --git a/sc/source/filter/excel/xecontent.cxx b/sc/source/filter/excel/xecontent.cxx index 765d8ef3c728..7bc5445de207 100644 --- a/sc/source/filter/excel/xecontent.cxx +++ b/sc/source/filter/excel/xecontent.cxx @@ -1739,6 +1739,8 @@ XclExpDV::XclExpDV( const XclExpRoot& rRoot, sal_uLong nScHandle ) : OUString aString; if( XclTokenArrayHelper::GetStringList( aString, *xScTokArr, '\n' ) ) { + bool bList = false; + OUStringBuffer sListBuf; OUStringBuffer sFormulaBuf; sFormulaBuf.append( '"' ); /* Formula is a list of string tokens -> build the Excel string. @@ -1751,12 +1753,22 @@ XclExpDV::XclExpDV( const XclExpRoot& rRoot, sal_uLong nScHandle ) : for(;;) { const OUString aToken( aString.getToken( 0, '\n', nStringIx ) ); + if (aToken.indexOf(",") != -1) + { + sListBuf.append('"'); + sListBuf.append(aToken); + sListBuf.append('"'); + bList = true; + } + else + sListBuf.append(aToken); mxString1->Append( aToken ); sFormulaBuf.append( aToken ); if (nStringIx<0) break; mxString1->Append(OUString(u'\0')); sFormulaBuf.append( ',' ); + sListBuf.append( ',' ); } } ::set_flag( mnFlags, EXC_DV_STRINGLIST ); @@ -1773,6 +1785,10 @@ XclExpDV::XclExpDV( const XclExpRoot& rRoot, sal_uLong nScHandle ) : sFormulaBuf.append( '"' ); msFormula1 = sFormulaBuf.makeStringAndClear(); + if (bList) + msList = sListBuf.makeStringAndClear(); + else + sListBuf.remove(0, sListBuf.getLength()); } else { @@ -1868,7 +1884,24 @@ void XclExpDV::SaveXml( XclExpXmlStream& rStrm ) XML_showInputMessage, ToPsz( ::get_flag( mnFlags, EXC_DV_SHOWPROMPT ) ), XML_sqref, XclXmlUtils::ToOString(rStrm.GetRoot().GetDoc(), maScRanges), XML_type, lcl_GetValidationType(mnFlags) ); - if( !msFormula1.isEmpty() ) + if (!msList.isEmpty()) + { + rWorksheet->startElement(FSNS(XML_mc, XML_AlternateContent), + FSNS(XML_xmlns, XML_x12ac),rStrm.getNamespaceURL(OOX_NS(x12ac)), + FSNS(XML_xmlns, XML_mc),rStrm.getNamespaceURL(OOX_NS(mce))); + rWorksheet->startElement(FSNS(XML_mc, XML_Choice), XML_Requires, "x12ac"); + rWorksheet->startElement(FSNS(XML_x12ac, XML_list)); + rWorksheet->writeEscaped(msList); + rWorksheet->endElement(FSNS(XML_x12ac, XML_list)); + rWorksheet->endElement(FSNS(XML_mc, XML_Choice)); + rWorksheet->startElement(FSNS(XML_mc, XML_Fallback)); + rWorksheet->startElement(XML_formula1); + rWorksheet->writeEscaped(msFormula1); + rWorksheet->endElement(XML_formula1); + rWorksheet->endElement(FSNS(XML_mc, XML_Fallback)); + rWorksheet->endElement(FSNS(XML_mc, XML_AlternateContent)); + } + if (msList.isEmpty() && !msFormula1.isEmpty()) { rWorksheet->startElement(XML_formula1); rWorksheet->writeEscaped( msFormula1 ); diff --git a/sc/source/filter/inc/xecontent.hxx b/sc/source/filter/inc/xecontent.hxx index bc873e81466d..7632af4f807d 100644 --- a/sc/source/filter/inc/xecontent.hxx +++ b/sc/source/filter/inc/xecontent.hxx @@ -343,6 +343,7 @@ private: XclExpStringRef mxString1; /// String for first condition formula. XclTokenArrayRef mxTokArr1; /// Formula for first condition. OUString msFormula1; /// OOXML Formula for first condition. + OUString msList; /// x12ac:list for first condition. XclTokenArrayRef mxTokArr2; /// Formula for second condition. OUString msFormula2; /// OOXML Formula for second condition. sal_uInt32 mnFlags; /// Miscellaneous flags. _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits