diff options
author | Bartosz Kosiorek <gang65@poczta.onet.pl> | 2016-07-08 10:08:00 +0200 |
---|---|---|
committer | Eike Rathke <erack@redhat.com> | 2016-12-05 17:41:28 +0000 |
commit | 740f369a90a7e524bfd2f82ba9cb350c190fe282 (patch) | |
tree | 93542cbca0ba001c28c3bcee6252c8a6f968ded8 | |
parent | 21d340948d564c819e24edd96051c42a9ca2c78e (diff) |
tdf#51524 Preserve hidden column width after saving into .xlsx and .xls
Change-Id: I7f69a1e8f8ef46d8b0ab889df30498ec54917230
Reviewed-on: https://gerrit.libreoffice.org/27035
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Eike Rathke <erack@redhat.com>
Tested-by: Eike Rathke <erack@redhat.com>
(cherry picked from commit b0d96a82a4f6a0832d03d185f4a53db669adcc99)
Reviewed-on: https://gerrit.libreoffice.org/31643
-rw-r--r-- | sc/qa/unit/data/ods/outline.ods | bin | 7764 -> 7834 bytes | |||
-rw-r--r-- | sc/qa/unit/subsequent_export-test.cxx | 107 | ||||
-rw-r--r-- | sc/source/filter/excel/xetable.cxx | 10 |
3 files changed, 97 insertions, 20 deletions
diff --git a/sc/qa/unit/data/ods/outline.ods b/sc/qa/unit/data/ods/outline.ods Binary files differindex 320e318fbba7..ac951b7d43ef 100644 --- a/sc/qa/unit/data/ods/outline.ods +++ b/sc/qa/unit/data/ods/outline.ods diff --git a/sc/qa/unit/subsequent_export-test.cxx b/sc/qa/unit/subsequent_export-test.cxx index cf94ac53dbd8..ddd2b994c31b 100644 --- a/sc/qa/unit/subsequent_export-test.cxx +++ b/sc/qa/unit/subsequent_export-test.cxx @@ -479,7 +479,8 @@ void ScExportTest::testFormatExportODS() void ScExportTest::testOutlineExportXLSX() { - //tdf#100347 FILESAVE FILEOPEN after exporting to xlsx format grouping are lost + //tdf#100347 FILESAVE FILEOPEN after exporting to .xlsx format grouping are lost + //tdf#51524 FILESAVE .xlsx and.xls looses width information for hidden/collapsed grouped columns ScDocShellRef xShell = loadDoc("outline.", FORMAT_ODS); CPPUNIT_ASSERT(xShell.Is()); @@ -487,71 +488,143 @@ void ScExportTest::testOutlineExportXLSX() xmlDocPtr pSheet = XPathHelper::parseExport(pXPathFile, m_xSFactory, "xl/worksheets/sheet1.xml"); CPPUNIT_ASSERT(pSheet); + // First XML node, creates two columns (from min=1 to max=2) assertXPath(pSheet, "/x:worksheet/x:cols/x:col[1]", "hidden", "false"); assertXPath(pSheet, "/x:worksheet/x:cols/x:col[1]", "outlineLevel", "1"); assertXPath(pSheet, "/x:worksheet/x:cols/x:col[1]", "collapsed", "false"); - assertXPath(pSheet, "/x:worksheet/x:cols/x:col[2]", "hidden", "false"); + assertXPath(pSheet, "/x:worksheet/x:cols/x:col[1]", "min", "1"); + assertXPath(pSheet, "/x:worksheet/x:cols/x:col[1]", "max", "2"); + + assertXPath(pSheet, "/x:worksheet/x:cols/x:col[2]", "hidden", "true"); assertXPath(pSheet, "/x:worksheet/x:cols/x:col[2]", "outlineLevel", "2"); assertXPath(pSheet, "/x:worksheet/x:cols/x:col[2]", "collapsed", "false"); + assertXPath(pSheet, "/x:worksheet/x:cols/x:col[2]", "min", "3"); + assertXPath(pSheet, "/x:worksheet/x:cols/x:col[2]", "max", "3"); + + // Column 4 has custom width and it is hidden. We need to make sure that it is created assertXPath(pSheet, "/x:worksheet/x:cols/x:col[3]", "hidden", "true"); - assertXPath(pSheet, "/x:worksheet/x:cols/x:col[3]", "outlineLevel", "3"); + assertXPath(pSheet, "/x:worksheet/x:cols/x:col[3]", "outlineLevel", "2"); assertXPath(pSheet, "/x:worksheet/x:cols/x:col[3]", "collapsed", "false"); + assertXPath(pSheet, "/x:worksheet/x:cols/x:col[3]", "min", "4"); + assertXPath(pSheet, "/x:worksheet/x:cols/x:col[3]", "max", "4"); + assertXPath(pSheet, "/x:worksheet/x:cols/x:col[4]", "hidden", "true"); - assertXPath(pSheet, "/x:worksheet/x:cols/x:col[4]", "outlineLevel", "4"); + assertXPath(pSheet, "/x:worksheet/x:cols/x:col[4]", "outlineLevel", "3"); assertXPath(pSheet, "/x:worksheet/x:cols/x:col[4]", "collapsed", "false"); + assertXPath(pSheet, "/x:worksheet/x:cols/x:col[4]", "min", "5"); + assertXPath(pSheet, "/x:worksheet/x:cols/x:col[4]", "max", "6"); + assertXPath(pSheet, "/x:worksheet/x:cols/x:col[5]", "hidden", "true"); - assertXPath(pSheet, "/x:worksheet/x:cols/x:col[5]", "outlineLevel", "3"); + assertXPath(pSheet, "/x:worksheet/x:cols/x:col[5]", "outlineLevel", "4"); assertXPath(pSheet, "/x:worksheet/x:cols/x:col[5]", "collapsed", "false"); - assertXPath(pSheet, "/x:worksheet/x:cols/x:col[6]", "hidden", "false"); - assertXPath(pSheet, "/x:worksheet/x:cols/x:col[6]", "outlineLevel", "2"); - assertXPath(pSheet, "/x:worksheet/x:cols/x:col[6]", "collapsed", "true"); - assertXPath(pSheet, "/x:worksheet/x:cols/x:col[7]", "hidden", "false"); - assertXPath(pSheet, "/x:worksheet/x:cols/x:col[7]", "outlineLevel", "2"); + assertXPath(pSheet, "/x:worksheet/x:cols/x:col[5]", "min", "7"); + assertXPath(pSheet, "/x:worksheet/x:cols/x:col[5]", "max", "7"); + + // Column 8 has custom width and it is hidden. We need to make sure that it is created + assertXPath(pSheet, "/x:worksheet/x:cols/x:col[6]", "hidden", "true"); + assertXPath(pSheet, "/x:worksheet/x:cols/x:col[6]", "outlineLevel", "4"); + assertXPath(pSheet, "/x:worksheet/x:cols/x:col[6]", "collapsed", "false"); + assertXPath(pSheet, "/x:worksheet/x:cols/x:col[6]", "min", "8"); + assertXPath(pSheet, "/x:worksheet/x:cols/x:col[6]", "max", "8"); + + assertXPath(pSheet, "/x:worksheet/x:cols/x:col[7]", "hidden", "true"); + assertXPath(pSheet, "/x:worksheet/x:cols/x:col[7]", "outlineLevel", "4"); assertXPath(pSheet, "/x:worksheet/x:cols/x:col[7]", "collapsed", "false"); - assertXPath(pSheet, "/x:worksheet/x:cols/x:col[8]", "hidden", "false"); - assertXPath(pSheet, "/x:worksheet/x:cols/x:col[8]", "outlineLevel", "1"); - assertXPath(pSheet, "/x:worksheet/x:cols/x:col[8]", "collapsed", "false"); - assertXPath(pSheet, "/x:worksheet/x:cols/x:col[9]", "hidden", "false"); - assertXPath(pSheet, "/x:worksheet/x:cols/x:col[9]", "outlineLevel", "0"); - assertXPath(pSheet, "/x:worksheet/x:cols/x:col[9]", "collapsed", "false"); + assertXPath(pSheet, "/x:worksheet/x:cols/x:col[7]", "min", "9"); + assertXPath(pSheet, "/x:worksheet/x:cols/x:col[7]", "max", "19"); + + assertXPath(pSheet, "/x:worksheet/x:cols/x:col[8]", "hidden", "true"); + assertXPath(pSheet, "/x:worksheet/x:cols/x:col[8]", "outlineLevel", "3"); + assertXPath(pSheet, "/x:worksheet/x:cols/x:col[8]", "collapsed", "true"); + assertXPath(pSheet, "/x:worksheet/x:cols/x:col[8]", "min", "20"); + assertXPath(pSheet, "/x:worksheet/x:cols/x:col[8]", "max", "20"); + assertXPath(pSheet, "/x:worksheet/x:cols/x:col[9]", "hidden", "true"); + assertXPath(pSheet, "/x:worksheet/x:cols/x:col[9]", "outlineLevel", "3"); + assertXPath(pSheet, "/x:worksheet/x:cols/x:col[9]", "collapsed", "false"); + assertXPath(pSheet, "/x:worksheet/x:cols/x:col[9]", "min", "21"); + assertXPath(pSheet, "/x:worksheet/x:cols/x:col[9]", "max", "21"); + + assertXPath(pSheet, "/x:worksheet/x:cols/x:col[10]", "hidden", "true"); + assertXPath(pSheet, "/x:worksheet/x:cols/x:col[10]", "outlineLevel", "2"); + assertXPath(pSheet, "/x:worksheet/x:cols/x:col[10]", "collapsed", "false"); + assertXPath(pSheet, "/x:worksheet/x:cols/x:col[10]", "min", "22"); + assertXPath(pSheet, "/x:worksheet/x:cols/x:col[10]", "max", "23"); + + assertXPath(pSheet, "/x:worksheet/x:cols/x:col[11]", "hidden", "false"); + assertXPath(pSheet, "/x:worksheet/x:cols/x:col[11]", "outlineLevel", "1"); + assertXPath(pSheet, "/x:worksheet/x:cols/x:col[11]", "collapsed", "true"); + assertXPath(pSheet, "/x:worksheet/x:cols/x:col[11]", "min", "24"); + assertXPath(pSheet, "/x:worksheet/x:cols/x:col[11]", "max", "24"); + + assertXPath(pSheet, "/x:worksheet/x:cols/x:col[12]", "hidden", "false"); + assertXPath(pSheet, "/x:worksheet/x:cols/x:col[12]", "outlineLevel", "1"); + assertXPath(pSheet, "/x:worksheet/x:cols/x:col[12]", "collapsed", "false"); + assertXPath(pSheet, "/x:worksheet/x:cols/x:col[12]", "min", "25"); + assertXPath(pSheet, "/x:worksheet/x:cols/x:col[12]", "max", "26"); + + assertXPath(pSheet, "/x:worksheet/x:cols/x:col[13]", "hidden", "false"); + assertXPath(pSheet, "/x:worksheet/x:cols/x:col[13]", "outlineLevel", "0"); + assertXPath(pSheet, "/x:worksheet/x:cols/x:col[13]", "collapsed", "false"); + assertXPath(pSheet, "/x:worksheet/x:cols/x:col[13]", "min", "27"); + + // We expected that exactly 13 unique Nodes will be produced + assertXPath(pSheet, "/x:worksheet/x:cols/x:col", 13); + + // We need to save all 30 rows, as it provides information about outLineLevel + assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row[1]", "r", "1"); assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row[1]", "hidden", "false"); assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row[1]", "outlineLevel", "0"); assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row[1]", "collapsed", "false"); + assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row[2]", "r", "2"); assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row[2]", "hidden", "false"); assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row[2]", "outlineLevel", "1"); assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row[2]", "collapsed", "false"); + assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row[3]", "r", "3"); assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row[3]", "hidden", "false"); assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row[3]", "outlineLevel", "2"); assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row[3]", "collapsed", "false"); + assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row[4]", "r", "4"); assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row[4]", "hidden", "false"); assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row[4]", "outlineLevel", "2"); assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row[4]", "collapsed", "false"); + assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row[5]", "r", "5"); assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row[5]", "hidden", "false"); assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row[5]", "outlineLevel", "3"); assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row[5]", "collapsed", "false"); + assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row[6]", "r", "6"); assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row[6]", "hidden", "false"); assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row[6]", "outlineLevel", "3"); assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row[6]", "collapsed", "false"); + assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row[7]", "r", "7"); assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row[7]", "hidden", "true"); assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row[7]", "outlineLevel", "4"); assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row[7]", "collapsed", "false"); + assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row[8]", "r", "8"); assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row[8]", "hidden", "true"); assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row[8]", "outlineLevel", "4"); assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row[8]", "collapsed", "false"); + assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row[9]", "r", "9"); assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row[9]", "hidden", "true"); assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row[9]", "outlineLevel", "4"); assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row[9]", "collapsed", "false"); - //next rows are the same as the previous one + // Next rows are the same as the previous one but it needs to bre preserved, + // as they contain information about outlineLevel + assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row[21]", "r", "21"); assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row[21]", "hidden", "true"); assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row[21]", "outlineLevel", "4"); assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row[21]", "collapsed", "false"); + assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row[22]", "r", "22"); assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row[22]", "hidden", "false"); assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row[22]", "outlineLevel", "3"); assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row[22]", "collapsed", "true"); + assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row[23]", "r", "23"); assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row[23]", "hidden", "false"); assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row[23]", "outlineLevel", "3"); assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row[23]", "collapsed", "false"); + + // We expected that exactly 30 Row Nodes will be produced + assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row", 30); } diff --git a/sc/source/filter/excel/xetable.cxx b/sc/source/filter/excel/xetable.cxx index 34cb7cb98cc2..beae3c002a4a 100644 --- a/sc/source/filter/excel/xetable.cxx +++ b/sc/source/filter/excel/xetable.cxx @@ -1593,8 +1593,8 @@ XclExpColinfo::XclExpColinfo( const XclExpRoot& rRoot, maXFId.mnXFId = GetXFBuffer().Insert( rDoc.GetMostUsedPattern( nScCol, 0, nLastScRow, nScTab ), GetDefApiScript() ); - // column width - sal_uInt16 nScWidth = rDoc.GetColWidth( nScCol, nScTab ); + // column width. If column is hidden then we should return real value (not zero) + sal_uInt16 nScWidth = rDoc.GetColWidth( nScCol, nScTab, false ); mnWidth = XclTools::GetXclColumnWidth( nScWidth, GetCharWidth() ); mnScWidth = sc::TwipsToHMM( nScWidth ); // column flags @@ -1614,7 +1614,10 @@ void XclExpColinfo::ConvertXFIndexes() bool XclExpColinfo::IsDefault( const XclExpDefcolwidth& rDefColWidth ) const { - return (maXFId.mnXFIndex == EXC_XF_DEFAULTCELL) && (mnFlags == 0) && rDefColWidth.IsDefWidth( mnWidth ); + return (maXFId.mnXFIndex == EXC_XF_DEFAULTCELL) && + (mnFlags == 0) && + (mnOutlineLevel == 0) && + rDefColWidth.IsDefWidth( mnWidth ); } bool XclExpColinfo::TryMerge( const XclExpColinfo& rColInfo ) @@ -1622,6 +1625,7 @@ bool XclExpColinfo::TryMerge( const XclExpColinfo& rColInfo ) if( (maXFId.mnXFIndex == rColInfo.maXFId.mnXFIndex) && (mnWidth == rColInfo.mnWidth) && (mnFlags == rColInfo.mnFlags) && + (mnOutlineLevel == rColInfo.mnOutlineLevel) && (mnLastXclCol + 1 == rColInfo.mnFirstXclCol) ) { mnLastXclCol = rColInfo.mnLastXclCol; |