[Libreoffice-commits] core.git: sc/qa sc/source

Bartosz Kosiorek gang65 at poczta.onet.pl
Tue Jul 12 09:21:33 UTC 2016


 sc/qa/unit/data/ods/outline.ods       |binary
 sc/qa/unit/subsequent_export-test.cxx |  107 ++++++++++++++++++++++++++++------
 sc/source/filter/excel/xetable.cxx    |   10 ++-
 3 files changed, 97 insertions(+), 20 deletions(-)

New commits:
commit b0d96a82a4f6a0832d03d185f4a53db669adcc99
Author: Bartosz Kosiorek <gang65 at poczta.onet.pl>
Date:   Fri Jul 8 10:08:00 2016 +0200

    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 at libreoffice.org>
    Reviewed-by: Eike Rathke <erack at redhat.com>
    Tested-by: Eike Rathke <erack at redhat.com>

diff --git a/sc/qa/unit/data/ods/outline.ods b/sc/qa/unit/data/ods/outline.ods
index 320e318..ac951b7 100644
Binary files a/sc/qa/unit/data/ods/outline.ods and b/sc/qa/unit/data/ods/outline.ods differ
diff --git a/sc/qa/unit/subsequent_export-test.cxx b/sc/qa/unit/subsequent_export-test.cxx
index 560db4d..3fca217 100644
--- a/sc/qa/unit/subsequent_export-test.cxx
+++ b/sc/qa/unit/subsequent_export-test.cxx
@@ -481,7 +481,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());
 
@@ -489,71 +490,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 105b168..29f636e 100644
--- a/sc/source/filter/excel/xetable.cxx
+++ b/sc/source/filter/excel/xetable.cxx
@@ -1589,8 +1589,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
@@ -1610,7 +1610,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 )
@@ -1618,6 +1621,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;


More information about the Libreoffice-commits mailing list