[Libreoffice-commits] core.git: sc/source
Bartosz Kosiorek
gang65 at poczta.onet.pl
Sun Aug 7 21:49:30 UTC 2016
sc/source/filter/excel/xetable.cxx | 17 ++++++++++++++---
1 file changed, 14 insertions(+), 3 deletions(-)
New commits:
commit 12408dad1b2af4055b91439e3cfbe46e0df52b41
Author: Bartosz Kosiorek <gang65 at poczta.onet.pl>
Date: Sun Aug 7 13:58:21 2016 +0200
tdf#101363 Fix precision of column width according to MS specification
In MS specification the output value is set with double precision after delimiter, according to formula:
=Truncate(({width in pixels} - 5)/{Maximum Digit Width} * 100 + 0.5)/100
Explanation of magic numbers:
- 5 number - are 4 pixels of margin padding (two on each side), plus 1 pixel padding for the gridlines. It is still unknown if it should be applied during LibreOffice export
- 100 number - used to limit precision to 0.01 with formula =Truncate( {value} * 100 ) / 100
- 0.5 number (0.005 to output value) - used to increase value before truncating, to avoid situation when 2.997 will be truncated to 2.99 and not to 3
Benefits of limited precision:
- small .xlsx file size
- slightly better performance during .xlsx import
- easier to track column width changes, especially in unit tests
- according to MS Excel specification
Change-Id: I0537df5f9d04f5c715784c2b0c4e0d4472904dcc
Reviewed-on: https://gerrit.libreoffice.org/27932
Tested-by: Jenkins <ci at libreoffice.org>
Reviewed-by: Markus Mohrhard <markus.mohrhard at googlemail.com>
diff --git a/sc/source/filter/excel/xetable.cxx b/sc/source/filter/excel/xetable.cxx
index 81edb36..9cc6552 100644
--- a/sc/source/filter/excel/xetable.cxx
+++ b/sc/source/filter/excel/xetable.cxx
@@ -1665,17 +1665,28 @@ void XclExpColinfo::SaveXml( XclExpXmlStream& rStrm )
if( nLastXclCol == static_cast< sal_uInt16 >( rStrm.GetRoot().GetMaxPos().Col() ) )
++nLastXclCol;
+ const double nExcelColumnWidth = mnScWidth / static_cast< double >( sc::TwipsToHMM( GetCharWidth() ) );
+
+ // tdf#101363 In MS specification the output value is set with double precision after delimiter:
+ // =Truncate(({width in pixels} - 5)/{Maximum Digit Width} * 100 + 0.5)/100
+ // Explanation of magic numbers:
+ // 5 number - are 4 pixels of margin padding (two on each side), plus 1 pixel padding for the gridlines.
+ // It is unknown if it should be applied during LibreOffice export
+ // 100 number - used to limit precision to 0.01 with formula =Truncate( {value}*100+0.5 ) / 100
+ // 0.5 number (0.005 to output value) - used to increase value before truncating,
+ // to avoid situation when 2.997 will be truncated to 2.99 and not to 3.00
+ const double nTruncatedExcelColumnWidth = std::trunc( nExcelColumnWidth * 100.0 + 0.5 ) / 100.0;
rStrm.GetCurrentStream()->singleElement( XML_col,
// OOXTODO: XML_bestFit,
XML_collapsed, XclXmlUtils::ToPsz( ::get_flag( mnFlags, EXC_COLINFO_COLLAPSED ) ),
XML_customWidth, XclXmlUtils::ToPsz( mbCustomWidth ),
XML_hidden, XclXmlUtils::ToPsz( ::get_flag( mnFlags, EXC_COLINFO_HIDDEN ) ),
XML_outlineLevel, OString::number( mnOutlineLevel ).getStr(),
- XML_max, OString::number( (nLastXclCol + 1) ).getStr(),
- XML_min, OString::number( (mnFirstXclCol + 1) ).getStr(),
+ XML_max, OString::number( nLastXclCol + 1 ).getStr(),
+ XML_min, OString::number( mnFirstXclCol + 1 ).getStr(),
// OOXTODO: XML_phonetic,
XML_style, lcl_GetStyleId( rStrm, maXFId.mnXFIndex ).getStr(),
- XML_width, OString::number( (double) (mnScWidth / (double)sc::TwipsToHMM( GetCharWidth() )) ).getStr(),
+ XML_width, OString::number( nTruncatedExcelColumnWidth ).getStr(),
FSEND );
}
More information about the Libreoffice-commits
mailing list