Kaydet (Commit) e913727c authored tarafından Mike Kaganski's avatar Mike Kaganski

tdf#124881: Provide a non-empty name for pivot table's data field

Otherwise, the empty string is used by Excel, so the field arrives
unnamed, disappearing from pivot table's cells upon refresh, etc.

Change-Id: I2e0f9fad2d766829f2b06425bec24ff182e3a869
Reviewed-on: https://gerrit.libreoffice.org/71065
Tested-by: Jenkins
Reviewed-by: 's avatarMike Kaganski <mike.kaganski@collabora.com>
üst ff6dea46
......@@ -47,9 +47,9 @@ public:
double fValue, const ScDPNumGroupInfo* pInfo, sal_Int32 nDatePart,
const SvNumberFormatter* pFormatter);
static OUString getDisplayedMeasureName(const OUString& rName, ScSubTotalFunc eFunc);
SC_DLLPUBLIC static OUString getDisplayedMeasureName(const OUString& rName, ScSubTotalFunc eFunc);
static ScSubTotalFunc toSubTotalFunc(ScGeneralFunction eGenFunc);
SC_DLLPUBLIC static ScSubTotalFunc toSubTotalFunc(ScGeneralFunction eGenFunc);
};
#endif
......
......@@ -2485,7 +2485,8 @@ void ScPivotTableFiltersTest::testTdf124651()
CPPUNIT_ASSERT(pDoc);
// We have to export name attribute, even though it's optional according to ECMA-376 standard,
// because Excel (at least 2016) seems to require it.
assertXPath(pDoc, "/x:pivotTableDefinition/x:dataFields/x:dataField", "name", "");
// tdf#124881: this shouldn't be an empty string
assertXPath(pDoc, "/x:pivotTableDefinition/x:dataFields/x:dataField", "name", "Sum - num");
}
void ScPivotTableFiltersTest::testTdf124736()
......
......@@ -1078,13 +1078,16 @@ void XclExpXmlPivotTables::SavePivotTableXml( XclExpXmlStream& rStrm, const ScDP
long nDimIdx = rDataField.mnPos;
assert(aCachedDims[nDimIdx]); // the loop above should have screened for NULL's.
const ScDPSaveDimension& rDim = *rDataField.mpDim;
const boost::optional<OUString> & pName = rDim.GetLayoutName();
boost::optional<OUString> pName = rDim.GetLayoutName();
// tdf#124651: despite being optional in CT_DataField according to ECMA-376 Part 1,
// Excel (at least 2016) seems to insist on the presence of "name" attribute in
// dataField element, even if empty
const OString sName = pName ? pName->toUtf8() : "";
// dataField element.
// tdf#124881: try to create a meaningful name; don't use empty string.
if (!pName)
pName = ScDPUtil::getDisplayedMeasureName(
rDim.GetName(), ScDPUtil::toSubTotalFunc(rDim.GetFunction()));
auto pItemAttList = sax_fastparser::FastSerializerHelper::createAttrList();
pItemAttList->add(XML_name, sName);
pItemAttList->add(XML_name, pName->toUtf8());
pItemAttList->add(XML_fld, OString::number(nDimIdx));
const char* pSubtotal = toOOXMLSubtotalType(rDim.GetFunction());
if (pSubtotal)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment