summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xchart2/qa/extras/chart2export.cxx14
-rw-r--r--chart2/qa/extras/data/odp/tdf119029.odpbin0 -> 13643 bytes
-rw-r--r--include/oox/export/chartexport.hxx2
-rw-r--r--oox/source/export/chartexport.cxx28
4 files changed, 36 insertions, 8 deletions
diff --git a/chart2/qa/extras/chart2export.cxx b/chart2/qa/extras/chart2export.cxx
index 81dfa2551a76..395b6af22640 100755
--- a/chart2/qa/extras/chart2export.cxx
+++ b/chart2/qa/extras/chart2export.cxx
@@ -107,6 +107,7 @@ public:
void testTdf116163();
void testCustomDataLabel();
void testCustomDataLabelMultipleSeries();
+ void testTdf119029();
CPPUNIT_TEST_SUITE(Chart2ExportTest);
CPPUNIT_TEST(testErrorBarXLSX);
@@ -176,6 +177,7 @@ public:
CPPUNIT_TEST(testTdf116163);
CPPUNIT_TEST(testCustomDataLabel);
CPPUNIT_TEST(testCustomDataLabelMultipleSeries);
+ CPPUNIT_TEST(testTdf119029);
CPPUNIT_TEST_SUITE_END();
protected:
@@ -1744,6 +1746,18 @@ void Chart2ExportTest::testCustomDataLabelMultipleSeries()
}
+void Chart2ExportTest::testTdf119029()
+{
+ load("/chart2/qa/extras/data/odp/", "tdf119029.odp");
+ // Only use "chart", without number, because the number depends on the previous tests
+ xmlDocPtr pXmlDoc = parseExport("ppt/charts/chart", "Impress MS PowerPoint 2007 XML");
+ CPPUNIT_ASSERT(pXmlDoc);
+
+ assertXPath(pXmlDoc,
+ "/c:chartSpace/c:chart/c:plotArea/c:barChart/c:ser/c:dLbls/c:txPr/a:bodyPr", "rot",
+ "-5400000");
+}
+
CPPUNIT_TEST_SUITE_REGISTRATION(Chart2ExportTest);
CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/chart2/qa/extras/data/odp/tdf119029.odp b/chart2/qa/extras/data/odp/tdf119029.odp
new file mode 100644
index 000000000000..87e4a03c844a
--- /dev/null
+++ b/chart2/qa/extras/data/odp/tdf119029.odp
Binary files differ
diff --git a/include/oox/export/chartexport.hxx b/include/oox/export/chartexport.hxx
index 9bbf1d3e16f9..e1ae1f4f0a9b 100644
--- a/include/oox/export/chartexport.hxx
+++ b/include/oox/export/chartexport.hxx
@@ -172,7 +172,7 @@ private:
void exportSeriesValues(
const css::uno::Reference< css::chart2::data::XDataSequence >& xValueSeq, sal_Int32 nValueType = XML_val );
void exportShapeProps( const css::uno::Reference< css::beans::XPropertySet >& xPropSet );
- void exportTextProps(const css::uno::Reference< css::beans::XPropertySet >& xPropSet, bool bAxis = false);
+ void exportTextProps(const css::uno::Reference< css::beans::XPropertySet >& xPropSet);
void exportDataPoints(
const css::uno::Reference< css::beans::XPropertySet >& xSeriesProperties,
sal_Int32 nSeriesLength, sal_Int32 eChartType );
diff --git a/oox/source/export/chartexport.cxx b/oox/source/export/chartexport.cxx
index bd33471c9dad..e127ee8480b0 100644
--- a/oox/source/export/chartexport.cxx
+++ b/oox/source/export/chartexport.cxx
@@ -2282,18 +2282,32 @@ void ChartExport::exportShapeProps( const Reference< XPropertySet >& xPropSet )
pFS->endElement( FSNS( XML_c, XML_spPr ) );
}
-void ChartExport::exportTextProps(const Reference<XPropertySet>& xPropSet, bool bAxis)
+void ChartExport::exportTextProps(const Reference<XPropertySet>& xPropSet)
{
FSHelperPtr pFS = GetFS();
pFS->startElement(FSNS(XML_c, XML_txPr), FSEND);
sal_Int32 nRotation = 0;
- if (bAxis)
+ if (auto xServiceInfo = uno::Reference<lang::XServiceInfo>(xPropSet, uno::UNO_QUERY))
{
- double fTextRotation = 0;
- uno::Any aAny = xPropSet->getPropertyValue("TextRotation");
- if (aAny.hasValue() && (aAny >>= fTextRotation))
- nRotation = fTextRotation * -600.0;
+ double fMultiplier = 0;
+ // We have at least two possible units of returned value: degrees (e.g., for data labels),
+ // and 100ths of degree (e.g., for axes labels). The latter is returned as an Any wrapping
+ // a sal_Int32 value (see WrappedTextRotationProperty::convertInnerToOuterValue), while
+ // the former is double. So we could test the contained type to decide which multiplier to
+ // use. But testing the service info should be more robust.
+ if (xServiceInfo->supportsService("com.sun.star.chart.ChartAxis"))
+ fMultiplier = -600.0;
+ else if (xServiceInfo->supportsService("com.sun.star.chart2.DataSeries"))
+ fMultiplier = -60000.0;
+
+ if (fMultiplier)
+ {
+ double fTextRotation = 0;
+ uno::Any aAny = xPropSet->getPropertyValue("TextRotation");
+ if (aAny.hasValue() && (aAny >>= fTextRotation))
+ nRotation = std::round(fTextRotation * fMultiplier);
+ }
}
if (nRotation)
@@ -2707,7 +2721,7 @@ void ChartExport::_exportAxis(
// shape properties
exportShapeProps( xAxisProp );
- exportTextProps(xAxisProp, true);
+ exportTextProps(xAxisProp);
pFS->singleElement( FSNS( XML_c, XML_crossAx ),
XML_val, I32S( rAxisIdPair.nCrossAx ),