include/oox/export/chartexport.hxx | 2 - oox/source/export/chartexport.cxx | 9 +++----- sc/qa/unit/data/xls/forum-fr-59757.xls |binary sc/qa/unit/subsequent_export_test.cxx | 35 +++++++++++++++++++++++++++++++++ 4 files changed, 40 insertions(+), 6 deletions(-)
New commits: commit 1c1f0f865a74c9fd8b00203f98235aea57b2cd03 Author: Ujjawal Kumar <[email protected]> AuthorDate: Tue Mar 3 16:03:11 2026 +0530 Commit: Miklos Vajna <[email protected]> CommitDate: Fri Mar 6 15:29:53 2026 +0100 ooxml: Use mnSeriesCount in export of stock charts for unique idx/order Excel expects unique values for idx and order in charts under the same plot area. Bug document: forum-fr-59757.xls The above documennt when exported to xlsx contains duplicate idx and order values for stock and line chart which renders excel unable to open the document. Change-Id: Ieefdd2ecb5b436e1a98606a35328d73a29073718 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/200907 Tested-by: Jenkins CollaboraOffice <[email protected]> Reviewed-by: Miklos Vajna <[email protected]> diff --git a/include/oox/export/chartexport.hxx b/include/oox/export/chartexport.hxx index 15944e44dbe6..81f63ae3cb96 100644 --- a/include/oox/export/chartexport.hxx +++ b/include/oox/export/chartexport.hxx @@ -216,7 +216,7 @@ private: void exportVaryColors(const css::uno::Reference<css::chart2::XChartType>& xChartType); void exportCandleStickSeries( const css::uno::Sequence<css::uno::Reference<css::chart2::XDataSeries>>& aSeriesSeq, - bool& rPrimaryAxes, sal_uInt32& nIdx); + bool& rPrimaryAxes); void exportSeriesText( const css::uno::Reference< css::chart2::data::XDataSequence >& xValueSeq ); diff --git a/oox/source/export/chartexport.cxx b/oox/source/export/chartexport.cxx index 29aea90b1fe7..b26e270541ed 100644 --- a/oox/source/export/chartexport.cxx +++ b/oox/source/export/chartexport.cxx @@ -2562,14 +2562,13 @@ void ChartExport::exportStockChart( const Reference< chart2::XChartType >& xChar aSplitDataSeries.push_back({}); } - sal_uInt32 nIdx = 0; for (const auto& splitDataSeries : aSplitDataSeries) { pFS->startElement(FSNS(XML_c, XML_stockChart)); bool bPrimaryAxes = true; if (splitDataSeries.hasElements()) - exportCandleStickSeries(splitDataSeries, bPrimaryAxes, nIdx); + exportCandleStickSeries(splitDataSeries, bPrimaryAxes); // export stock properties Reference< css::chart::XStatisticDisplay > xStockPropProvider(mxDiagram, uno::UNO_QUERY); @@ -2896,7 +2895,7 @@ void ChartExport::exportSeries( const Reference<chart2::XChartType>& xChartType, } void ChartExport::exportCandleStickSeries( - const Sequence<Reference<chart2::XDataSeries>>& aSeriesSeq, bool& rPrimaryAxes, sal_uInt32& nIdx) + const Sequence<Reference<chart2::XDataSeries>>& aSeriesSeq, bool& rPrimaryAxes) { for( const Reference< chart2::XDataSeries >& xSeries : aSeriesSeq ) { @@ -2925,8 +2924,8 @@ void ChartExport::exportCandleStickSeries( FSHelperPtr pFS = GetFS(); pFS->startElement(FSNS(XML_c, XML_ser)); - pFS->singleElement(FSNS(XML_c, XML_idx), XML_val, OString::number(++nIdx)); - pFS->singleElement(FSNS(XML_c, XML_order), XML_val, OString::number(nIdx)); + pFS->singleElement(FSNS(XML_c, XML_idx), XML_val, OString::number(mnSeriesCount)); + pFS->singleElement(FSNS(XML_c, XML_order), XML_val, OString::number(mnSeriesCount++)); // export label if( xLabelSeq.is() ) diff --git a/sc/qa/unit/data/xls/forum-fr-59757.xls b/sc/qa/unit/data/xls/forum-fr-59757.xls new file mode 100644 index 000000000000..320451cb9f44 Binary files /dev/null and b/sc/qa/unit/data/xls/forum-fr-59757.xls differ diff --git a/sc/qa/unit/subsequent_export_test.cxx b/sc/qa/unit/subsequent_export_test.cxx index 8dbe53c428f9..b0ad48407d5b 100644 --- a/sc/qa/unit/subsequent_export_test.cxx +++ b/sc/qa/unit/subsequent_export_test.cxx @@ -2287,6 +2287,41 @@ CPPUNIT_TEST_FIXTURE(ScExportTest, testCombinedChartsAxesSharing) CPPUNIT_ASSERT_EQUAL(barChartAxis2, scatterChart1Axis2); } +CPPUNIT_TEST_FIXTURE(ScExportTest, testForumFr59757) +{ + createScDoc("xls/forum-fr-59757.xls"); + save(TestFilter::XLSX); + + xmlDocUniquePtr pChart = parseExport(u"xl/charts/chart1.xml"_ustr); + CPPUNIT_ASSERT(pChart); + + // stock chart + assertXPath(pChart, "/c:chartSpace/c:chart/c:plotArea/c:stockChart/c:ser[1]/c:idx", "val", + u"0"); + assertXPath(pChart, "/c:chartSpace/c:chart/c:plotArea/c:stockChart/c:ser[1]/c:order", "val", + u"0"); + assertXPath(pChart, "/c:chartSpace/c:chart/c:plotArea/c:stockChart/c:ser[2]/c:idx", "val", + u"1"); + assertXPath(pChart, "/c:chartSpace/c:chart/c:plotArea/c:stockChart/c:ser[2]/c:order", "val", + u"1"); + assertXPath(pChart, "/c:chartSpace/c:chart/c:plotArea/c:stockChart/c:ser[3]/c:idx", "val", + u"2"); + assertXPath(pChart, "/c:chartSpace/c:chart/c:plotArea/c:stockChart/c:ser[3]/c:order", "val", + u"2"); + assertXPath(pChart, "/c:chartSpace/c:chart/c:plotArea/c:stockChart/c:ser[4]/c:idx", "val", + u"3"); + assertXPath(pChart, "/c:chartSpace/c:chart/c:plotArea/c:stockChart/c:ser[4]/c:order", "val", + u"3"); + + // line chart + assertXPath(pChart, "/c:chartSpace/c:chart/c:plotArea/c:lineChart/c:ser[1]/c:idx", "val", u"4"); + assertXPath(pChart, "/c:chartSpace/c:chart/c:plotArea/c:lineChart/c:ser[1]/c:order", "val", + u"4"); + assertXPath(pChart, "/c:chartSpace/c:chart/c:plotArea/c:lineChart/c:ser[2]/c:idx", "val", u"5"); + assertXPath(pChart, "/c:chartSpace/c:chart/c:plotArea/c:lineChart/c:ser[2]/c:order", "val", + u"5"); +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
