summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBartosz Kosiorek <gang65@poczta.onet.pl>2016-07-08 10:08:00 +0200
committerEike Rathke <erack@redhat.com>2016-12-05 17:41:28 +0000
commit740f369a90a7e524bfd2f82ba9cb350c190fe282 (patch)
tree93542cbca0ba001c28c3bcee6252c8a6f968ded8
parent21d340948d564c819e24edd96051c42a9ca2c78e (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.odsbin7764 -> 7834 bytes
-rw-r--r--sc/qa/unit/subsequent_export-test.cxx107
-rw-r--r--sc/source/filter/excel/xetable.cxx10
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
index 320e318fbba7..ac951b7d43ef 100644
--- a/sc/qa/unit/data/ods/outline.ods
+++ b/sc/qa/unit/data/ods/outline.ods
Binary files differ
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;