sc/qa/unit/data/ods/hidden-empty-rows.ods |binary
 sc/qa/unit/subsequent_export-test.cxx     |   19 +++++++++++++++++++
 sc/source/filter/excel/xetable.cxx        |   16 +++++++++-------
 sc/source/filter/inc/xetable.hxx          |    2 +-
 4 files changed, 29 insertions(+), 8 deletions(-)

New commits:
commit 228c25fd17727660a3372307e3f73dbcff5e71d2
Author: Bartosz Kosiorek <gan...@poczta.onet.pl>
Date:   Fri Jun 17 16:21:06 2016 +0200

    tdf#98106 Preserving hidden and empty rows after xlsx export
    
    Change-Id: I1ff2bab766eadac1dd5d483453af0e760634083d
    Reviewed-on: https://gerrit.libreoffice.org/26421
    Tested-by: Jenkins <c...@libreoffice.org>
    Reviewed-by: Markus Mohrhard <markus.mohrh...@googlemail.com>

diff --git a/sc/qa/unit/data/ods/hidden-empty-rows.ods 
b/sc/qa/unit/data/ods/hidden-empty-rows.ods
new file mode 100644
index 0000000..f3435ad
Binary files /dev/null and b/sc/qa/unit/data/ods/hidden-empty-rows.ods differ
diff --git a/sc/qa/unit/subsequent_export-test.cxx 
b/sc/qa/unit/subsequent_export-test.cxx
index 1e27fc7..28e518d 100644
--- a/sc/qa/unit/subsequent_export-test.cxx
+++ b/sc/qa/unit/subsequent_export-test.cxx
@@ -110,6 +110,8 @@ public:
     void testCellNoteExportXLS();
     void testFormatExportODS();
 
+    void testHiddenEmptyRowsXLSX();
+
     void testInlineArrayXLS();
     void testEmbeddedChartXLS();
     void testCellAnchoredGroupXLS();
@@ -191,6 +193,7 @@ public:
     CPPUNIT_TEST(testCellNoteExportODS);
     CPPUNIT_TEST(testCellNoteExportXLS);
     CPPUNIT_TEST(testFormatExportODS);
+    CPPUNIT_TEST(testHiddenEmptyRowsXLSX);
     CPPUNIT_TEST(testInlineArrayXLS);
     CPPUNIT_TEST(testEmbeddedChartXLS);
     CPPUNIT_TEST(testCellAnchoredGroupXLS);
@@ -469,6 +472,22 @@ void ScExportTest::testFormatExportODS()
     xDocSh->DoClose();
 }
 
+void ScExportTest::testHiddenEmptyRowsXLSX()
+{
+    //tdf#98106 FILESAVE: Hidden and empty rows became visible when export to 
.XLSX
+    ScDocShellRef xShell = loadDoc("hidden-empty-rows.", FORMAT_ODS);
+    CPPUNIT_ASSERT(xShell.Is());
+
+    std::shared_ptr<utl::TempFile> pXPathFile = 
ScBootstrapFixture::exportTo(&(*xShell), FORMAT_XLSX);
+    xmlDocPtr pSheet = XPathHelper::parseExport(pXPathFile, m_xSFactory, 
"xl/worksheets/sheet1.xml");
+    CPPUNIT_ASSERT(pSheet);
+
+    assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row[1]", "hidden", "true");
+    assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row[2]", "hidden", "true");
+    assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row[3]", "hidden", "true");
+    assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row[4]", "hidden", 
"false");
+}
+
 void ScExportTest::testDataBarExportXLSX()
 {
     ScDocShellRef xShell = loadDoc("databar.", FORMAT_XLSX);
diff --git a/sc/source/filter/excel/xetable.cxx 
b/sc/source/filter/excel/xetable.cxx
index f539b92..2b9d45a 100644
--- a/sc/source/filter/excel/xetable.cxx
+++ b/sc/source/filter/excel/xetable.cxx
@@ -1993,15 +1993,14 @@ sal_uInt16 XclExpRow::GetFirstFreeXclCol() const
 
 bool XclExpRow::IsDefaultable() const
 {
-    const sal_uInt16 nAllowedFlags = EXC_ROW_DEFAULTFLAGS | EXC_ROW_HIDDEN | 
EXC_ROW_UNSYNCED;
-    return !::get_flag( mnFlags, static_cast< sal_uInt16 >( ~nAllowedFlags ) ) 
&& IsEmpty();
+    const sal_uInt16 nFlagsAlwaysMarkedAsDefault = EXC_ROW_DEFAULTFLAGS | 
EXC_ROW_UNSYNCED;
+    return !::get_flag( mnFlags, static_cast< sal_uInt16 >( 
~nFlagsAlwaysMarkedAsDefault ) ) && IsEmpty();
 }
 
 void XclExpRow::DisableIfDefault( const XclExpDefaultRowData& rDefRowData )
 {
     mbEnabled = !IsDefaultable() ||
         (mnHeight != rDefRowData.mnHeight) ||
-        (IsHidden() != rDefRowData.IsHidden()) ||
         (IsUnsynced() != rDefRowData.IsUnsynced());
 }
 
@@ -2172,6 +2171,7 @@ void XclExpRowBuffer::Finalize( XclExpDefaultRowData& 
rDefRowData, const ScfUInt
     XclExpDefaultRowData aMaxDefData;
     size_t nMaxDefCount = 0;
     // only look for default format in existing rows, if there are more than 
unused
+    // if the row is hidden, then row xml must be created even if it not 
contain cells
     XclExpRow* pPrev = nullptr;
     typedef std::vector< XclExpRow* > XclRepeatedRows;
     XclRepeatedRows aRepeated;
@@ -2179,7 +2179,7 @@ void XclExpRowBuffer::Finalize( XclExpDefaultRowData& 
rDefRowData, const ScfUInt
     for (itr = itrBeg; itr != itrEnd; ++itr)
     {
         const RowRef& rRow = itr->second;
-        if (rRow->IsDefaultable())
+        if ( rRow->IsDefaultable() )
         {
             XclExpDefaultRowData aDefData( *rRow );
             size_t& rnDefCount = aDefRowMap[ aDefData ];
@@ -2192,7 +2192,7 @@ void XclExpRowBuffer::Finalize( XclExpDefaultRowData& 
rDefRowData, const ScfUInt
         }
         if ( pPrev )
         {
-            if ( pPrev->IsDefaultable())
+            if ( pPrev->IsDefaultable() )
             {
                 // if the previous row we processed is not
                 // defaultable then afaict the rows in between are
@@ -2325,8 +2325,10 @@ XclExpRow& XclExpRowBuffer::GetOrCreateRow( sal_uInt32 
nXclRow, bool bRowAlwaysE
         if ( itr == maRowMap.end() )
         {
             // only create RowMap entries for rows that differ from previous,
-            // or if it is the desired row
-            if ( !nFrom || ( nFrom == nXclRow ) || ( nFrom && ( 
rDoc.GetRowHeight(nFrom, nScTab, false) != rDoc.GetRowHeight(nFrom-1, nScTab, 
false) ) ) )
+            // the row is hidden (tdf#98106) or if it is the desired row
+            if ( !nFrom || ( nFrom == nXclRow ) ||
+                 ( rDoc.GetRowHeight(nFrom, nScTab, false) != 
rDoc.GetRowHeight(nFrom - 1, nScTab, false) ) ||
+                 ( rDoc.RowHidden(nFrom, nScTab) ) )
             {
                 RowRef p(new XclExpRow(GetRoot(), nFrom, maOutlineBfr, 
bRowAlwaysEmpty));
                 maRowMap.insert(RowMap::value_type(nFrom, p));
diff --git a/sc/source/filter/inc/xetable.hxx b/sc/source/filter/inc/xetable.hxx
index 140c152..7d8bc50 100644
--- a/sc/source/filter/inc/xetable.hxx
+++ b/sc/source/filter/inc/xetable.hxx
@@ -591,7 +591,7 @@ public:
 
 protected:
     /** Constructs the outline buffer.
-        @param bRows  true = Process row ouline array; false = Process column 
outline array. */
+        @param bRows  true = Process row outline array; false = Process column 
outline array. */
     explicit            XclExpOutlineBuffer( const XclExpRoot& rRoot, bool 
bRows );
 
     /** Updates the current state by processing the settings at the passed 
Calc position. */
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to