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: */

Reply via email to