[Libreoffice-commits] core.git: Branch 'libreoffice-5-2' - sc/qa sc/source
Bartosz Kosiorek
gang65 at poczta.onet.pl
Mon Dec 5 17:40:46 UTC 2016
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 7dd19273530730478b5ed24b79f42ac480c7ae43
Author: Bartosz Kosiorek <gang65 at 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 <ci at libreoffice.org>
Reviewed-by: Markus Mohrhard <markus.mohrhard at googlemail.com>
(cherry picked from commit 228c25fd17727660a3372307e3f73dbcff5e71d2)
Reviewed-on: https://gerrit.libreoffice.org/31640
Reviewed-by: Eike Rathke <erack at redhat.com>
Tested-by: Eike Rathke <erack at redhat.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 163c2b9..5055dcb 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 24b3230..b668eb8 100644
--- a/sc/source/filter/excel/xetable.cxx
+++ b/sc/source/filter/excel/xetable.cxx
@@ -1997,15 +1997,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());
}
@@ -2176,6 +2175,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;
@@ -2183,7 +2183,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 ];
@@ -2196,7 +2196,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
@@ -2329,8 +2329,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. */
More information about the Libreoffice-commits
mailing list