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