sc/qa/unit/data/ods/empty_cells_with_background.ods |binary
 sc/qa/unit/subsequent_export-test.cxx               |   28 ++++++++++++++++++++
 sc/source/core/data/attarray.cxx                    |   11 +++++--
 3 files changed, 35 insertions(+), 4 deletions(-)

New commits:
commit 5239cefff56875c7bb45c046977f1724aace0cfb
Author: Bartosz Kosiorek <gan...@poczta.onet.pl>
Date:   Sat Oct 15 14:36:28 2016 +0200

    tdf#46738 Fix exporting .xlsx of coloured empty cells
    
    When spreadsheet contains more that 84 cells, and these
    cells are empty, but contains additional data (border color,
    text color, specific formatting), the remaining rows are
    ignored during export to .xlsx and .xls
    As a result such empty rows are not saved during export.
    This patch is fixing most cases and make sure that at least
    first 84 empty cells will be preserved.
    It is not impacting the performance as it is still notchecking
    next columns when the visible cells are more that 84 characters.
    This patch improve exporting empty cells, but not impacts
    performance.
    
    Change-Id: Ia7027e2c8a2fd48ab4a0e840f970d57167454451
    Reviewed-on: https://gerrit.libreoffice.org/29899
    Tested-by: Jenkins <c...@libreoffice.org>
    Reviewed-by: Markus Mohrhard <markus.mohrh...@googlemail.com>

diff --git a/sc/qa/unit/data/ods/empty_cells_with_background.ods 
b/sc/qa/unit/data/ods/empty_cells_with_background.ods
new file mode 100644
index 0000000..1301bca
Binary files /dev/null and 
b/sc/qa/unit/data/ods/empty_cells_with_background.ods differ
diff --git a/sc/qa/unit/subsequent_export-test.cxx 
b/sc/qa/unit/subsequent_export-test.cxx
index 9c45175..693990d 100644
--- a/sc/qa/unit/subsequent_export-test.cxx
+++ b/sc/qa/unit/subsequent_export-test.cxx
@@ -111,6 +111,7 @@ public:
     void testXfDefaultValuesXLSX();
     void testOutlineExportXLSX();
     void testHiddenEmptyRowsXLSX();
+    void testEmptyRowsWithBackgroundColorXLSX();
     void testLandscapeOrientationXLSX();
 
     void testInlineArrayXLS();
@@ -202,6 +203,7 @@ public:
     CPPUNIT_TEST(testXfDefaultValuesXLSX);
     CPPUNIT_TEST(testOutlineExportXLSX);
     CPPUNIT_TEST(testHiddenEmptyRowsXLSX);
+    CPPUNIT_TEST(testEmptyRowsWithBackgroundColorXLSX);
     CPPUNIT_TEST(testLandscapeOrientationXLSX);
     CPPUNIT_TEST(testInlineArrayXLS);
     CPPUNIT_TEST(testEmbeddedChartXLS);
@@ -753,6 +755,32 @@ void ScExportTest::testOutlineExportXLSX()
     assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row", 30);
 }
 
+void ScExportTest::testEmptyRowsWithBackgroundColorXLSX()
+{
+    // tdf#46738 FILESAVE:  Cell background and border color formatting 
information of empty cells
+    // lost in particular document after FILESAVE as xls and xlsx
+    ScDocShellRef xShell = loadDoc("empty_cells_with_background.", 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);
+
+    // Check if all 100 rows are saved into .xlsx file,
+    // as it contains information about background color information (style)
+    assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row[1]", "r", "1");
+    assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row[2]", "r", "2");
+    assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row[3]", "r", "3");
+    assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row[100]", "r", "100");
+    assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row", 100);
+
+    // Check if all 4 column were created
+    assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row[100]/x:c[1]", "r", 
"A100");
+    assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row[100]/x:c[2]", "r", 
"B100");
+    assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row[100]/x:c[3]", "r", 
"C100");
+    assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row[100]/x:c[4]", "r", 
"D100");
+    assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row[100]/x:c", 4);
+}
 
 void ScExportTest::testHiddenEmptyRowsXLSX()
 {
diff --git a/sc/source/core/data/attarray.cxx b/sc/source/core/data/attarray.cxx
index fb90fb4..cf54262 100644
--- a/sc/source/core/data/attarray.cxx
+++ b/sc/source/core/data/attarray.cxx
@@ -1815,7 +1815,7 @@ bool ScAttrArray::GetFirstVisibleAttr( SCROW& rFirstRow ) 
const
     return bFound;
 }
 
-// size (rows) of a range of attributes after cell content where the search is 
stopped
+// Number of rows after the search will be stopped
 // (more than a default page size, 2*42 because it's as good as any number)
 
 const SCROW SC_VISATTR_STOP = 84;
@@ -1860,13 +1860,16 @@ bool ScAttrArray::GetLastVisibleAttr( SCROW& rLastRow, 
SCROW nLastData ) const
         if ( nAttrStartRow <= nLastData )
             nAttrStartRow = nLastData + 1;
         SCROW nAttrSize = pData[nEndPos].nRow + 1 - nAttrStartRow;
-        if ( nAttrSize >= SC_VISATTR_STOP )
-            break;  // while, ignore this range and below
-        else if ( pData[nEndPos].pPattern->IsVisible() )
+        if ( pData[nEndPos].pPattern->IsVisible() )
         {
             rLastRow = pData[nEndPos].nRow;
             bFound = true;
         }
+        // We are not ignoring range for current column,
+        // if it is larger than SC_VISATTR_STOP, because it is still in 
default page size range.
+        // We are not checking next columns, due to performance reasons.
+        if ( nAttrSize >= SC_VISATTR_STOP )
+            break;
         nPos = nEndPos + 1;
     }
 
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to