From 577b95f4d0cc1cf8836ff35fc30189c64fefb508 Mon Sep 17 00:00:00 2001 From: Mike Kaganski Date: Wed, 10 Apr 2019 15:18:07 +0300 Subject: [PATCH] tdf#124651: always write "name" attribute to dataField element Despite being optional as per ECMA-376-1:2016, Excel 2016 seems to require the presence of "name" attribute in dataField element of pivot table definition, so make sure to write at least empty string there. Change-Id: Iaab5674f86b7dd0b267776678e11af47086635d7 Reviewed-on: https://gerrit.libreoffice.org/70522 Reviewed-by: Mike Kaganski Tested-by: Mike Kaganski --- .../data/ods/tdf124651_simplePivotTable.ods | Bin 0 -> 10427 bytes sc/qa/unit/pivottable_filters_test.cxx | 15 +++++++++++++++ sc/source/filter/excel/xepivotxml.cxx | 7 +++++-- 3 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 sc/qa/unit/data/ods/tdf124651_simplePivotTable.ods diff --git a/sc/qa/unit/data/ods/tdf124651_simplePivotTable.ods b/sc/qa/unit/data/ods/tdf124651_simplePivotTable.ods new file mode 100644 index 0000000000000000000000000000000000000000..05fd5fec838f3fec17354ebb961cd4aae4defdd6 GIT binary patch literal 10427 zcmdUVbyS;6_byO0Kn03R3lu2sMT$dl3Eo0+f_s8H6pFjM7YNegQk(+CixhX);GyV+ z^SkHk>37?+*1iATo%QCOWWD>DnVrd=J$pYu*?Y*35fIQ35F9yz75puEgP9Q!5bmzq zuMn)vtUwSKTado3t)-cvKE%w%n#IxDh}lLTYzAhwu?1Nh*%&%lfvh3SU|V~Tz7g0I z1cCs6!Mug}j}YIs#B8jM%}gBZ|3U+^v)J0$I@sPqII#R#kMwtX_BJN=ATZcK-~L}T z34fz`*V(^o{cfCKh(5&O|DiXCjg95M_x8Kl=^Gk?EJ3$MviZNAow22jJ_Ph{T2Fps z6EiD)6A+k1)C^*!ZwvkxgZ|DmcT=?0w+31MZ#{H$^uLzVZ9o4Jz-@_*C1LJ{xtUh@lYbMG-6;Lnx9+&E5c5E1)hMtP% zf)<Ie&!m`^$Vbr+cqY{wJRQ4olQu0&5!~Xy zozic_kphgby>=ILQnRtLeZ3rvCyPf9&`verC3Lz9f|*+epb%SRbR^TPLU&LrzKuTh z;ZtHFTth%~0_lXS81---TBL;zlsd2rgKNbtA?b9s9BRhj&Qz0L zVgtCAIk%~>ZJRLB(aJzQ7Mw8(56nIH*xv$a%*B=tV#q#nl*l^Jl|yP(L1h6njKQv1 zdINp_<^I`r-;r(7xz@^OF9)?z*w@R_keb$I=|<8HNSq{SGR|mW8i|9l z0a(=G8-U7Ts9gWP#~hoDlaof>S4G>ZO19DbxdZ!NBx!Ugz7NH0f%||-Hp}C2jnW

H(c`jB)k7hzuQ@yv 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 a|KO&9vM9Gc{`RDD`vToM9pPtppZ*uPR3p^@ literal 0 HcmV?d00001 diff --git a/sc/qa/unit/pivottable_filters_test.cxx b/sc/qa/unit/pivottable_filters_test.cxx index 739af618ec7d..d5b1afd64701 100644 --- a/sc/qa/unit/pivottable_filters_test.cxx +++ b/sc/qa/unit/pivottable_filters_test.cxx @@ -85,6 +85,7 @@ public: void testTdf112106(); void testTdf123923(); void testTdf123939(); + void testTdf124651(); CPPUNIT_TEST_SUITE(ScPivotTableFiltersTest); @@ -127,6 +128,7 @@ public: CPPUNIT_TEST(testTdf112106); CPPUNIT_TEST(testTdf123923); CPPUNIT_TEST(testTdf123939); + CPPUNIT_TEST(testTdf124651); CPPUNIT_TEST_SUITE_END(); @@ -2430,6 +2432,19 @@ void ScPivotTableFiltersTest::testTdf123939() "containsMixedTypes", "1"); } +void ScPivotTableFiltersTest::testTdf124651() +{ + ScDocShellRef xDocSh = loadDoc("tdf124651_simplePivotTable.", FORMAT_ODS); + CPPUNIT_ASSERT(xDocSh.is()); + + xmlDocPtr pDoc = XPathHelper::parseExport2(*this, *xDocSh, m_xSFactory, + "xl/pivotTables/pivotTable1.xml", FORMAT_XLSX); + 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", ""); +} + CPPUNIT_TEST_SUITE_REGISTRATION(ScPivotTableFiltersTest); CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/sc/source/filter/excel/xepivotxml.cxx b/sc/source/filter/excel/xepivotxml.cxx index 1a47e2cfeb5b..69c98d13c55b 100644 --- a/sc/source/filter/excel/xepivotxml.cxx +++ b/sc/source/filter/excel/xepivotxml.cxx @@ -947,9 +947,12 @@ void XclExpXmlPivotTables::SavePivotTableXml( XclExpXmlStream& rStrm, const ScDP assert(aCachedDims[nDimIdx]); // the loop above should have screened for NULL's. const ScDPSaveDimension& rDim = *rDataField.mpDim; const boost::optional & 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() : ""; pPivotStrm->write("<")->writeId(XML_dataField); - if (pName) - rStrm.WriteAttributes(XML_name, pName->toUtf8(), FSEND); + rStrm.WriteAttributes(XML_name, sName, FSEND); rStrm.WriteAttributes(XML_fld, OString::number(nDimIdx).getStr(), FSEND);