oox/source/export/chartexport.cxx          |   40 ++++++++++++++++++-----------
 sc/qa/unit/data/xls/forum-mso-de-37362.xls |binary
 sc/qa/unit/subsequent_export_test.cxx      |   12 ++++++++
 3 files changed, 38 insertions(+), 14 deletions(-)

New commits:
commit 88ea92f52e0dc4c031364ff1808bbec03613c6b7
Author:     Ujjawal Kumar <[email protected]>
AuthorDate: Wed Mar 4 00:29:20 2026 +0530
Commit:     Miklos Vajna <[email protected]>
CommitDate: Fri Mar 6 09:27:48 2026 +0100

    ooxml: Fix reuse logic of axes for charts
    
    Bug document: forum-mso-de-37362.xls
    
    The above document when exported to xlsx produces
    an extra cat and val axes resulting in a total of
    3 axis pairs because of a logic error due to which
    excel fails to open this file.
    
    The above fix ensures that the existing axes are
    reused properly.
    
    Change-Id: I576e01f7ba71065b5db0350fb8311697d1d864e5
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/200910
    Tested-by: Jenkins CollaboraOffice <[email protected]>
    Reviewed-by: Miklos Vajna <[email protected]>

diff --git a/oox/source/export/chartexport.cxx 
b/oox/source/export/chartexport.cxx
index 39769f3a376b..9e1fd1551e02 100644
--- a/oox/source/export/chartexport.cxx
+++ b/oox/source/export/chartexport.cxx
@@ -4326,22 +4326,33 @@ void ChartExport::exportDataPoints(
 
 void ChartExport::exportAxesId(bool bPrimaryAxes, bool bCheckCombinedAxes)
 {
-    sal_Int32 nAxisIdx, nAxisIdy;
-    bool bPrimaryAxisExists = false;
-    bool bSecondaryAxisExists = false;
-    // let's check which axis already exists and which axis is attached to the 
actual dataseries
-    if (maAxes.size() >= 2)
-    {
-        bPrimaryAxisExists = bPrimaryAxes && maAxes[1].nAxisType == 
AXIS_PRIMARY_Y;
-        bSecondaryAxisExists = !bPrimaryAxes && maAxes[1].nAxisType == 
AXIS_SECONDARY_Y;
-    }
-    // tdf#114181 keep axes of combined charts
-    if ( bCheckCombinedAxes && ( bPrimaryAxisExists || bSecondaryAxisExists ) )
+    sal_Int32 nAxisIdx = -1, nAxisIdy = -1;
+    bool bCreateAxes = true;
+
+    // tdf#114181 keep axes of combined charts - search for existing pairs
+    if (bCheckCombinedAxes)
     {
-        nAxisIdx = maAxes[0].nAxisId;
-        nAxisIdy = maAxes[1].nAxisId;
+        const AxesType eWantedX = bPrimaryAxes ? AXIS_PRIMARY_X : 
AXIS_SECONDARY_X;
+        const AxesType eWantedY = bPrimaryAxes ? AXIS_PRIMARY_Y : 
AXIS_SECONDARY_Y;
+
+        sal_Int32 nFoundX = -1, nFoundY = -1;
+        for (const auto& rAxis : maAxes)
+        {
+            if (rAxis.nAxisType == eWantedX)
+                nFoundX = rAxis.nAxisId;
+            else if (rAxis.nAxisType == eWantedY)
+                nFoundY = rAxis.nAxisId;
+        }
+
+        if (nFoundX != -1 && nFoundY != -1)
+        {
+            bCreateAxes = false;
+            nAxisIdx = nFoundX;
+            nAxisIdy = nFoundY;
+        }
     }
-    else
+
+    if (bCreateAxes)
     {
         nAxisIdx = lcl_generateRandomValue();
         nAxisIdy = lcl_generateRandomValue();
@@ -4350,6 +4361,7 @@ void ChartExport::exportAxesId(bool bPrimaryAxes, bool 
bCheckCombinedAxes)
         maAxes.emplace_back( eXAxis, nAxisIdx, nAxisIdy );
         maAxes.emplace_back( eYAxis, nAxisIdy, nAxisIdx );
     }
+
     FSHelperPtr pFS = GetFS();
     pFS->singleElement(FSNS(XML_c, XML_axId), XML_val, 
OString::number(nAxisIdx));
     pFS->singleElement(FSNS(XML_c, XML_axId), XML_val, 
OString::number(nAxisIdy));
diff --git a/sc/qa/unit/data/xls/forum-mso-de-37362.xls 
b/sc/qa/unit/data/xls/forum-mso-de-37362.xls
new file mode 100644
index 000000000000..75ea5e83b7c9
Binary files /dev/null and b/sc/qa/unit/data/xls/forum-mso-de-37362.xls differ
diff --git a/sc/qa/unit/subsequent_export_test.cxx 
b/sc/qa/unit/subsequent_export_test.cxx
index 98151610a2c7..6cf4198006ee 100644
--- a/sc/qa/unit/subsequent_export_test.cxx
+++ b/sc/qa/unit/subsequent_export_test.cxx
@@ -2251,6 +2251,18 @@ CPPUNIT_TEST_FIXTURE(ScExportTest, testTdf155368)
     assertXPath(pStyles, "/x:styleSheet/x:cellXfs/x:xf[2]/x:alignment", 
"wrapText", u"false");
 }
 
+CPPUNIT_TEST_FIXTURE(ScExportTest, testCombinedChartAxesCount)
+{
+    createScDoc("xls/forum-mso-de-37362.xls");
+    save(TestFilter::XLSX);
+
+    xmlDocUniquePtr pChart = parseExport(u"xl/charts/chart1.xml"_ustr);
+    CPPUNIT_ASSERT(pChart);
+
+    assertXPath(pChart, "/c:chartSpace/c:chart/c:plotArea/c:catAx", 2);
+    assertXPath(pChart, "/c:chartSpace/c:chart/c:plotArea/c:valAx", 2);
+}
+
 CPPUNIT_PLUGIN_IMPLEMENT();
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Reply via email to