chart2/qa/extras/chart2export.cxx            |   20 ++++++++
 chart2/qa/extras/data/ods/tdf132076.ods      |binary
 chart2/qa/extras/data/xlsx/tdf132076.xlsx    |binary
 oox/source/drawingml/chart/axisconverter.cxx |   10 ++--
 oox/source/export/chartexport.cxx            |   62 ++++++++++++++++++++++++---
 5 files changed, 82 insertions(+), 10 deletions(-)

New commits:
commit 75156c6fd73dc202df541306e1636727d51d6fc3
Author:     Balazs Varga <balazs.varga...@gmail.com>
AuthorDate: Thu Apr 16 22:08:15 2020 +0200
Commit:     László Németh <nem...@numbertext.org>
CommitDate: Fri Apr 24 15:28:17 2020 +0200

    tdf#132076 Chart OOXML: fix lost date format of X axis
    
    labels. Set the number format of category or date axes
    too and use date axis type for date axes at import.
    Export the real axis type of the X axis.
    
    Change-Id: I45f5c69f0aadc4ec1db0b8873b5e374e2728d39c
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/92396
    Tested-by: László Németh <nem...@numbertext.org>
    Reviewed-by: László Németh <nem...@numbertext.org>

diff --git a/chart2/qa/extras/chart2export.cxx 
b/chart2/qa/extras/chart2export.cxx
index 378e2361d034..b44d712dbd50 100644
--- a/chart2/qa/extras/chart2export.cxx
+++ b/chart2/qa/extras/chart2export.cxx
@@ -165,6 +165,7 @@ public:
     void testTdf75330();
     void testTdf127792();
     void testTdf131979();
+    void testTdf132076();
 
     CPPUNIT_TEST_SUITE(Chart2ExportTest);
     CPPUNIT_TEST(testErrorBarXLSX);
@@ -293,6 +294,7 @@ public:
     CPPUNIT_TEST(testTdf75330);
     CPPUNIT_TEST(testTdf127792);
     CPPUNIT_TEST(testTdf131979);
+    CPPUNIT_TEST(testTdf132076);
 
     CPPUNIT_TEST_SUITE_END();
 
@@ -2711,6 +2713,24 @@ void Chart2ExportTest::testTdf131979()
     }
 }
 
+void Chart2ExportTest::testTdf132076()
+{
+    {
+        load("/chart2/qa/extras/data/ods/", "tdf132076.ods");
+        xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open 
XML");
+        CPPUNIT_ASSERT(pXmlDoc);
+        assertXPath(pXmlDoc, 
"/c:chartSpace/c:chart/c:plotArea/c:catAx/c:numFmt", "formatCode", "dd");
+        assertXPath(pXmlDoc, 
"/c:chartSpace/c:chart/c:plotArea/c:catAx/c:numFmt", "sourceLinked", "0");
+    }
+    {
+        load("/chart2/qa/extras/data/xlsx/", "tdf132076.xlsx");
+        xmlDocPtr pXmlDoc = parseExport("xl/charts/chart", "Calc Office Open 
XML");
+        CPPUNIT_ASSERT(pXmlDoc);
+        assertXPath(pXmlDoc, 
"/c:chartSpace/c:chart/c:plotArea/c:dateAx/c:numFmt", "formatCode", "dd");
+        assertXPath(pXmlDoc, 
"/c:chartSpace/c:chart/c:plotArea/c:dateAx/c:numFmt", "sourceLinked", "0");
+    }
+}
+
 CPPUNIT_TEST_SUITE_REGISTRATION(Chart2ExportTest);
 
 CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/chart2/qa/extras/data/ods/tdf132076.ods 
b/chart2/qa/extras/data/ods/tdf132076.ods
new file mode 100644
index 000000000000..348dd0d71f25
Binary files /dev/null and b/chart2/qa/extras/data/ods/tdf132076.ods differ
diff --git a/chart2/qa/extras/data/xlsx/tdf132076.xlsx 
b/chart2/qa/extras/data/xlsx/tdf132076.xlsx
new file mode 100644
index 000000000000..799ef9c8555a
Binary files /dev/null and b/chart2/qa/extras/data/xlsx/tdf132076.xlsx differ
diff --git a/oox/source/drawingml/chart/axisconverter.cxx 
b/oox/source/drawingml/chart/axisconverter.cxx
index 9e62b61d73bc..d73632476550 100644
--- a/oox/source/drawingml/chart/axisconverter.cxx
+++ b/oox/source/drawingml/chart/axisconverter.cxx
@@ -205,10 +205,8 @@ void AxisConverter::convertFromModel(
                     OSL_ENSURE( (mrModel.mnTypeId == C_TOKEN( catAx )) || 
(mrModel.mnTypeId == C_TOKEN( dateAx )),
                         "AxisConverter::convertFromModel - unexpected axis 
model type (must: c:catAx or c:dateAx)" );
                     bool bDateAxis = mrModel.mnTypeId == C_TOKEN( dateAx );
-                    /*  Chart2 requires axis type CATEGORY for automatic
-                        category/date axis (even if it is a date axis
-                        currently). */
-                    aScaleData.AxisType = (bDateAxis && !mrModel.mbAuto) ? 
cssc2::AxisType::DATE : cssc2::AxisType::CATEGORY;
+                    // tdf#132076: set axis type to date, if it is a date axis!
+                    aScaleData.AxisType = bDateAxis ? cssc2::AxisType::DATE : 
cssc2::AxisType::CATEGORY;
                     aScaleData.AutoDateAxis = mrModel.mbAuto;
                     aScaleData.Categories = 
rTypeGroups.front()->createCategorySequence();
                     /* set default ShiftedCategoryPosition values for some 
charttype,
@@ -341,8 +339,10 @@ void AxisConverter::convertFromModel(
         xAxis->setScaleData( aScaleData );
 
         // number format ------------------------------------------------------
-        if( !mrModel.mbDeleted && ((aScaleData.AxisType == 
cssc2::AxisType::REALNUMBER) || (aScaleData.AxisType == 
cssc2::AxisType::PERCENT)) )
+        if( !mrModel.mbDeleted && aScaleData.AxisType != 
cssc2::AxisType::SERIES )
+        {
             getFormatter().convertNumberFormat(aAxisProp, 
mrModel.maNumberFormat, true);
+        }
 
         // position of crossing axis ------------------------------------------
 
diff --git a/oox/source/export/chartexport.cxx 
b/oox/source/export/chartexport.cxx
index 16c4788b32b7..556e8a8a5958 100644
--- a/oox/source/export/chartexport.cxx
+++ b/oox/source/export/chartexport.cxx
@@ -67,6 +67,7 @@
 #include <com/sun/star/chart2/data/XNumericalDataSequence.hpp>
 #include <com/sun/star/chart2/data/XLabeledDataSequence.hpp>
 #include <com/sun/star/chart2/XAnyDescriptionAccess.hpp>
+#include <com/sun/star/chart2/AxisType.hpp>
 
 #include <com/sun/star/beans/XPropertySet.hpp>
 #include <com/sun/star/container/XNameAccess.hpp>
@@ -260,6 +261,39 @@ static bool lcl_isCategoryAxisShifted(const Reference< 
chart2::XChartDocument >&
     return isCategoryPositionShifted;
 }
 
+static sal_Int32 lcl_getCategoryAxisType( const Reference< chart2::XDiagram >& 
xDiagram, sal_Int32 nDimensionIndex, sal_Int32 nAxisIndex )
+{
+    sal_Int32 nAxisType = -1;
+    try
+    {
+        Reference< chart2::XCoordinateSystemContainer > xCooSysCnt(
+            xDiagram, uno::UNO_QUERY_THROW);
+        const Sequence< Reference< chart2::XCoordinateSystem > > aCooSysSeq(
+            xCooSysCnt->getCoordinateSystems());
+        for( const auto& xCooSys : aCooSysSeq )
+        {
+            OSL_ASSERT(xCooSys.is());
+            if( nDimensionIndex < xCooSys->getDimension() && nAxisIndex <= 
xCooSys->getMaximumAxisIndexByDimension(nDimensionIndex) )
+            {
+                Reference< chart2::XAxis > xAxis = 
xCooSys->getAxisByDimension(nDimensionIndex, nAxisIndex);
+                OSL_ASSERT(xAxis.is());
+                if( xAxis.is() )
+                {
+                    chart2::ScaleData aScaleData = xAxis->getScaleData();
+                    nAxisType = aScaleData.AxisType;
+                    break;
+                }
+            }
+        }
+    }
+    catch (const uno::Exception&)
+    {
+        DBG_UNHANDLED_EXCEPTION("oox");
+    }
+
+    return nAxisType;
+}
+
 static bool lcl_isSeriesAttachedToFirstAxis(
     const Reference< chart2::XDataSeries > & xDataSeries )
 {
@@ -2644,7 +2678,7 @@ void ChartExport::exportAxes( )
 
 namespace {
 
-sal_Int32 getXAxisType(sal_Int32 eChartType)
+sal_Int32 getXAxisTypeByChartType(sal_Int32 eChartType)
 {
     if( (eChartType == chart::TYPEID_SCATTER)
             || (eChartType == chart::TYPEID_BUBBLE) )
@@ -2655,6 +2689,18 @@ sal_Int32 getXAxisType(sal_Int32 eChartType)
     return XML_catAx;
 }
 
+sal_Int32 getRealXAxisType(sal_Int32 nAxisType)
+{
+    if( nAxisType == chart2::AxisType::CATEGORY )
+        return XML_catAx;
+    else if( nAxisType == chart2::AxisType::DATE )
+        return XML_dateAx;
+    else if( nAxisType == chart2::AxisType::SERIES )
+        return XML_serAx;
+
+    return XML_valAx;
+}
+
 }
 
 void ChartExport::exportAxis(const AxisIdPair& rAxisIdPair)
@@ -2709,8 +2755,11 @@ void ChartExport::exportAxis(const AxisIdPair& 
rAxisIdPair)
             if( bHasXAxisMinorGrid )
                 xMinorGrid = xAxisXSupp->getXHelpGrid();
 
-            sal_Int32 eChartType = getChartType();
-            nAxisType = getXAxisType(eChartType);
+            nAxisType = lcl_getCategoryAxisType(mxNewDiagram, 0, 0);
+            if( nAxisType != -1 )
+                nAxisType = getRealXAxisType(nAxisType);
+            else
+                nAxisType = getXAxisTypeByChartType( getChartType() );
             // FIXME: axPos, need to check axis direction
             sAxPos = "b";
             break;
@@ -2767,8 +2816,11 @@ void ChartExport::exportAxis(const AxisIdPair& 
rAxisIdPair)
                 xAxisTitle = xAxisSupp->getSecondXAxisTitle();
             }
 
-            sal_Int32 eChartType = getChartType();
-            nAxisType = getXAxisType(eChartType);
+            nAxisType = lcl_getCategoryAxisType(mxNewDiagram, 0, 1);
+            if( nAxisType != -1 )
+                nAxisType = getRealXAxisType(nAxisType);
+            else
+                nAxisType = getXAxisTypeByChartType( getChartType() );
             // FIXME: axPos, need to check axis direction
             sAxPos = "t";
             break;
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to