oox/source/drawingml/chart/axisconverter.cxx | 7 ++++++- oox/source/export/chartexport.cxx | 17 ++++++++++++++--- sc/source/filter/excel/xechart.cxx | 13 +++++++++---- sc/source/filter/excel/xichart.cxx | 18 ++++++++++-------- 4 files changed, 39 insertions(+), 16 deletions(-)
New commits: commit 274825b4180c81540cd0d1b22c5243f1b39fe4db Author: Bartosz Kosiorek <bartosz.kosio...@tomtom.com> Date: Wed Feb 7 02:57:30 2018 +0100 tdf#114168 If minor axis unit is automatic, then set it to 5 Based on OOXML implementation in MS Excel, if Minor axis Unit is set to automatic, then during chart import, LibreOffice should set Interval Count to 5, to mimic behaviour of MS Excel. Becaues default Interval Count for LibreOffice is 2, we need to override it to 5. With that solution, the Minor axis unit is preserved also after saving to .ods file format. During .xlsx export, if Interval Count is set to 5, then treat is as automatic axis unit. Change-Id: Iab9209fb3950ef73e79229329606363b528d35fe Reviewed-on: https://gerrit.libreoffice.org/49327 Tested-by: Jenkins <c...@libreoffice.org> Reviewed-by: Bartosz Kosiorek <gan...@poczta.onet.pl> diff --git a/oox/source/drawingml/chart/axisconverter.cxx b/oox/source/drawingml/chart/axisconverter.cxx index ffefc380fe48..727c0f599489 100644 --- a/oox/source/drawingml/chart/axisconverter.cxx +++ b/oox/source/drawingml/chart/axisconverter.cxx @@ -273,7 +273,7 @@ void AxisConverter::convertFromModel( case cssc2::AxisType::PERCENT: { // scaling algorithm - bool bLogScale = lclIsLogarithmicScale( mrModel ); + const bool bLogScale = lclIsLogarithmicScale( mrModel ); if( bLogScale ) aScaleData.Scaling = LogarithmicScaling::create( comphelper::getProcessComponentContext() ); else @@ -303,6 +303,11 @@ void AxisConverter::convertFromModel( if( (1.0 <= fCount) && (fCount < 1001.0) ) rIntervalCount <<= static_cast< sal_Int32 >( fCount ); } + else if( !mrModel.mofMinorUnit.has() ) + { + // tdf#114168 If minor unit is not set then set interval to 5, as MS Excel do. + rIntervalCount <<= static_cast< sal_Int32 >( 5 ); + } } break; default: diff --git a/oox/source/export/chartexport.cxx b/oox/source/export/chartexport.cxx index 684a8983503d..8e1a05be1ae0 100644 --- a/oox/source/export/chartexport.cxx +++ b/oox/source/export/chartexport.cxx @@ -2829,9 +2829,20 @@ void ChartExport::_exportAxis( { double dMinorUnit = 0; mAny >>= dMinorUnit; - pFS->singleElement( FSNS( XML_c, XML_minorUnit ), - XML_val, IS( dMinorUnit ), - FSEND ); + if( GetProperty( xAxisProp, "StepHelpCount" ) ) + { + sal_Int32 dMinorUnitCount = 0; + mAny >>= dMinorUnitCount; + // tdf#114168 Don't save minor unit if number of step help count is 5 (which is default for MS Excel), + // to allow proper .xlsx import. If minorUnit is set and majorUnit not, then it is impossible + // to calculate StepHelpCount. + if( dMinorUnitCount != 5 ) + { + pFS->singleElement( FSNS( XML_c, XML_minorUnit ), + XML_val, IS( dMinorUnit ), + FSEND ); + } + } } if( nAxisType == XML_valAx && GetProperty( xAxisProp, "DisplayUnits" ) ) diff --git a/sc/source/filter/excel/xechart.cxx b/sc/source/filter/excel/xechart.cxx index 6edc1cb72e42..d9c19c679551 100644 --- a/sc/source/filter/excel/xechart.cxx +++ b/sc/source/filter/excel/xechart.cxx @@ -2747,14 +2747,19 @@ void XclExpChValueRange::Convert( const ScaleData& rScaleData ) // major increment const IncrementData& rIncrementData = rScaleData.IncrementData; - bool bAutoMajor = lclIsAutoAnyOrGetValue( maData.mfMajorStep, rIncrementData.Distance ) || (maData.mfMajorStep <= 0.0); + const bool bAutoMajor = lclIsAutoAnyOrGetValue( maData.mfMajorStep, rIncrementData.Distance ) || (maData.mfMajorStep <= 0.0); ::set_flag( maData.mnFlags, EXC_CHVALUERANGE_AUTOMAJOR, bAutoMajor ); // minor increment const Sequence< SubIncrement >& rSubIncrementSeq = rIncrementData.SubIncrements; sal_Int32 nCount = 0; - bool bAutoMinor = bLogScale || bAutoMajor || (rSubIncrementSeq.getLength() < 1) || - lclIsAutoAnyOrGetValue( nCount, rSubIncrementSeq[ 0 ].IntervalCount ) || (nCount < 1); - if( !bAutoMinor ) + + // tdf#114168 If IntervalCount is 5, then enable automatic minor calculation. + // During import, if minorUnit is set and majorUnit not, then it is impossible + // to calculate IntervalCount. + const bool bAutoMinor = bLogScale || bAutoMajor || (rSubIncrementSeq.getLength() < 1) || + lclIsAutoAnyOrGetValue( nCount, rSubIncrementSeq[ 0 ].IntervalCount ) || (nCount < 1) || (nCount == 5); + + if( maData.mfMajorStep && !bAutoMinor ) maData.mfMinorStep = maData.mfMajorStep / nCount; ::set_flag( maData.mnFlags, EXC_CHVALUERANGE_AUTOMINOR, bAutoMinor ); diff --git a/sc/source/filter/excel/xichart.cxx b/sc/source/filter/excel/xichart.cxx index 28aece1b72b3..3fb920328116 100644 --- a/sc/source/filter/excel/xichart.cxx +++ b/sc/source/filter/excel/xichart.cxx @@ -3066,7 +3066,7 @@ void XclImpChValueRange::ReadChValueRange( XclImpStream& rStrm ) void XclImpChValueRange::Convert( ScaleData& rScaleData, bool bMirrorOrient ) const { // scaling algorithm - bool bLogScale = ::get_flag( maData.mnFlags, EXC_CHVALUERANGE_LOGSCALE ); + const bool bLogScale = ::get_flag( maData.mnFlags, EXC_CHVALUERANGE_LOGSCALE ); if( bLogScale ) rScaleData.Scaling = css::chart2::LogarithmicScaling::create( comphelper::getProcessComponentContext() ); else @@ -3092,14 +3092,16 @@ void XclImpChValueRange::Convert( ScaleData& rScaleData, bool bMirrorOrient ) co if( !bAutoMinor ) rIntervalCount <<= sal_Int32( 9 ); } - else + else if( !bAutoMajor && !bAutoMinor && (0.0 < maData.mfMinorStep) && (maData.mfMinorStep <= maData.mfMajorStep) ) { - if( !bAutoMajor && !bAutoMinor && (0.0 < maData.mfMinorStep) && (maData.mfMinorStep <= maData.mfMajorStep) ) - { - double fCount = maData.mfMajorStep / maData.mfMinorStep + 0.5; - if( (1.0 <= fCount) && (fCount < 1001.0) ) - rIntervalCount <<= static_cast< sal_Int32 >( fCount ); - } + double fCount = maData.mfMajorStep / maData.mfMinorStep + 0.5; + if( (1.0 <= fCount) && (fCount < 1001.0) ) + rIntervalCount <<= static_cast< sal_Int32 >( fCount ); + } + else if( bAutoMinor ) + { + // tdf#114168 If minor unit is not set then set interval to 5, as MS Excel do. + rIntervalCount <<= static_cast< sal_Int32 >( 5 ); } // reverse order _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits