diff options
author | Tibor Nagy <nagy.tibor2@nisz.hu> | 2020-10-13 15:48:31 +0200 |
---|---|---|
committer | László Németh <nemeth@numbertext.org> | 2020-10-19 10:42:53 +0200 |
commit | 699372466384113cf015be714e0067e857f8fa5c (patch) | |
tree | f984253d733c4406394df31609de441f6a7281b2 /sc/source | |
parent | 1441ab9c75a2f0ac664983db22b681a1b602f8a9 (diff) |
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 <nemeth@numbertext.org>
Reviewed-by: László Németh <nemeth@numbertext.org>
Diffstat (limited to 'sc/source')
-rw-r--r-- | sc/source/filter/excel/xecontent.cxx | 35 | ||||
-rw-r--r-- | sc/source/filter/inc/xecontent.hxx | 1 |
2 files changed, 35 insertions, 1 deletions
diff --git a/sc/source/filter/excel/xecontent.cxx b/sc/source/filter/excel/xecontent.cxx index a04c456fdeaa..dbb28ec7b81c 100644 --- a/sc/source/filter/excel/xecontent.cxx +++ b/sc/source/filter/excel/xecontent.cxx @@ -1738,6 +1738,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. @@ -1750,12 +1752,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 ); @@ -1774,6 +1786,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 { @@ -1869,7 +1885,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. |