summaryrefslogtreecommitdiff
path: root/sc/source
diff options
context:
space:
mode:
authorTibor Nagy <nagy.tibor2@nisz.hu>2020-10-13 15:48:31 +0200
committerLászló Németh <nemeth@numbertext.org>2020-10-19 10:42:53 +0200
commit699372466384113cf015be714e0067e857f8fa5c (patch)
treef984253d733c4406394df31609de441f6a7281b2 /sc/source
parent1441ab9c75a2f0ac664983db22b681a1b602f8a9 (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.cxx35
-rw-r--r--sc/source/filter/inc/xecontent.hxx1
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.