summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustin Luth <justin_luth@sil.org>2017-02-10 12:44:47 +0300
committerBartosz Kosiorek <gang65@poczta.onet.pl>2017-02-14 01:14:28 +0000
commit1cde2eb9d128c9b1b658b1380074461429ab2214 (patch)
treea32594b08b8fb7f809173109dda25fd1e146071c
parent86ff0df3bd71f2e79f85b1facc7737455e732309 (diff)
tdf#105840 EXCEL export: fixes for hidden defaultRow
second attempt at fixing hidden rows without creating a million repeated rows. (related to tdf#98106) This affects both .xls and .xlsx. XLSX previously had NO support for default-hidden(zeroHeight), but XLS already did. Change-Id: I804e3f2ba21e595a1c2b2ebb355f0995868dd289 Reviewed-on: https://gerrit.libreoffice.org/34128 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Bartosz Kosiorek <gang65@poczta.onet.pl>
-rw-r--r--sc/qa/unit/data/xlsx/tdf105840_allRowsHidden.xlsxbin0 -> 7015 bytes
-rw-r--r--sc/qa/unit/subsequent_export-test.cxx14
-rw-r--r--sc/source/filter/excel/xetable.cxx21
-rw-r--r--sc/source/filter/inc/xetable.hxx2
4 files changed, 29 insertions, 8 deletions
diff --git a/sc/qa/unit/data/xlsx/tdf105840_allRowsHidden.xlsx b/sc/qa/unit/data/xlsx/tdf105840_allRowsHidden.xlsx
new file mode 100644
index 000000000000..e2c22cd16d8f
--- /dev/null
+++ b/sc/qa/unit/data/xlsx/tdf105840_allRowsHidden.xlsx
Binary files differ
diff --git a/sc/qa/unit/subsequent_export-test.cxx b/sc/qa/unit/subsequent_export-test.cxx
index 6413db82c015..fbb16cd9748c 100644
--- a/sc/qa/unit/subsequent_export-test.cxx
+++ b/sc/qa/unit/subsequent_export-test.cxx
@@ -116,6 +116,7 @@ public:
void testColumnWidthExportFromODStoXLSX();
void testOutlineExportXLSX();
void testHiddenEmptyRowsXLSX();
+ void testAllRowsHiddenXLSX();
void testLandscapeOrientationXLSX();
void testInlineArrayXLS();
@@ -217,6 +218,7 @@ public:
CPPUNIT_TEST(testColumnWidthExportFromODStoXLSX);
CPPUNIT_TEST(testOutlineExportXLSX);
CPPUNIT_TEST(testHiddenEmptyRowsXLSX);
+ CPPUNIT_TEST(testAllRowsHiddenXLSX);
CPPUNIT_TEST(testLandscapeOrientationXLSX);
CPPUNIT_TEST(testInlineArrayXLS);
CPPUNIT_TEST(testEmbeddedChartXLS);
@@ -891,6 +893,17 @@ void ScExportTest::testOutlineExportXLSX()
assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row", 30);
}
+void ScExportTest::testAllRowsHiddenXLSX()
+{
+ ScDocShellRef xOrigDocSh = loadDoc("tdf105840_allRowsHidden.", FORMAT_XLSX);
+ CPPUNIT_ASSERT(xOrigDocSh.is());
+
+ std::shared_ptr<utl::TempFile> pXPathFile = ScBootstrapFixture::exportTo(&(*xOrigDocSh), FORMAT_XLSX);
+ xmlDocPtr pSheet = XPathHelper::parseExport(pXPathFile, m_xSFactory, "xl/worksheets/sheet1.xml");
+ CPPUNIT_ASSERT(pSheet);
+ assertXPath(pSheet, "/x:worksheet/x:sheetFormatPr", "zeroHeight", "true" );
+ assertXPath(pSheet, "/x:worksheet/x:sheetData/x:row", 0);
+}
void ScExportTest::testHiddenEmptyRowsXLSX()
{
@@ -902,6 +915,7 @@ void ScExportTest::testHiddenEmptyRowsXLSX()
xmlDocPtr pSheet = XPathHelper::parseExport(pXPathFile, m_xSFactory, "xl/worksheets/sheet1.xml");
CPPUNIT_ASSERT(pSheet);
+ assertXPath(pSheet, "/x:worksheet/x:sheetFormatPr", "zeroHeight", "false" );
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");
diff --git a/sc/source/filter/excel/xetable.cxx b/sc/source/filter/excel/xetable.cxx
index ee16f1690e08..9ec23a1aa79b 100644
--- a/sc/source/filter/excel/xetable.cxx
+++ b/sc/source/filter/excel/xetable.cxx
@@ -2047,7 +2047,7 @@ sal_uInt16 XclExpRow::GetFirstFreeXclCol() const
bool XclExpRow::IsDefaultable() const
{
- const sal_uInt16 nFlagsAlwaysMarkedAsDefault = EXC_ROW_DEFAULTFLAGS | EXC_ROW_UNSYNCED;
+ const sal_uInt16 nFlagsAlwaysMarkedAsDefault = EXC_ROW_DEFAULTFLAGS | EXC_ROW_HIDDEN | EXC_ROW_UNSYNCED;
return !::get_flag( mnFlags, static_cast< sal_uInt16 >( ~nFlagsAlwaysMarkedAsDefault ) ) &&
IsEmpty();
}
@@ -2056,6 +2056,7 @@ void XclExpRow::DisableIfDefault( const XclExpDefaultRowData& rDefRowData )
{
mbEnabled = !IsDefaultable() ||
(mnHeight != rDefRowData.mnHeight) ||
+ (IsHidden() != rDefRowData.IsHidden()) ||
(IsUnsynced() != rDefRowData.IsUnsynced());
}
@@ -2275,12 +2276,15 @@ void XclExpRowBuffer::Finalize( XclExpDefaultRowData& rDefRowData, const ScfUInt
// return the default row format to caller
rDefRowData = aMaxDefData;
- // now disable repeating extra (empty) rows that are equal to
- // default row height
+ // now disable repeating extra (empty) rows that are equal to the default row
for ( XclRepeatedRows::iterator it = aRepeated.begin(), it_end = aRepeated.end(); it != it_end; ++it)
{
- if ( (*it)->GetXclRowRpt() > 1 && (*it)->GetHeight() == rDefRowData.mnHeight )
+ if ( (*it)->GetXclRowRpt() > 1
+ && (*it)->GetHeight() == rDefRowData.mnHeight
+ && (*it)->IsHidden() == rDefRowData.IsHidden() )
+ {
(*it)->SetXclRowRpt( 1 );
+ }
}
// *** Disable unused ROW records, find used area *** ---------------------
@@ -2399,16 +2403,17 @@ XclExpRow& XclExpRowBuffer::GetOrCreateRow( sal_uInt32 nXclRow, bool bRowAlwaysE
while( nFrom <= nXclRow )
{
// only create RowMap entries if it is first row in spreadsheet,
- // if it is the desired row, for rows that height differ from previous,
- // if row is collapsed, has outline level (tdf#100347), or row is hidden (tdf#98106).
+ // if it is the desired row, or for rows that differ from previous.
const bool bHidden = rDoc.RowHidden(nFrom, nScTab);
// Always get the actual row height even if the manual size flag is
// not set, to correctly export the heights of rows with wrapped
// texts.
const sal_uInt16 nHeight = rDoc.GetRowHeight(nFrom, nScTab, false);
- if ( !pPrevEntry || ( nFrom == nXclRow ) || bHidden ||
+ if ( !pPrevEntry || ( nFrom == nXclRow ) ||
( maOutlineBfr.IsCollapsed() ) ||
( maOutlineBfr.GetLevel() != 0 ) ||
+ ( bRowAlwaysEmpty && !pPrevEntry->IsEmpty() ) ||
+ ( bHidden != pPrevEntry->IsHidden() ) ||
( nHeight != pPrevEntry->GetHeight() ) )
{
if( maOutlineBfr.GetLevel() > mnHighestOutlineLevel )
@@ -2703,10 +2708,10 @@ void XclExpCellTable::SaveXml( XclExpXmlStream& rStrm )
// OOXTODO: XML_baseColWidth
// OOXTODO: XML_defaultColWidth
// OOXTODO: XML_customHeight
- // OOXTODO: XML_zeroHeight
// OOXTODO: XML_thickTop
// OOXTODO: XML_thickBottom
XML_defaultRowHeight, OString::number( static_cast< double> ( rDefData.mnHeight ) / 20.0 ).getStr(),
+ XML_zeroHeight, XclXmlUtils::ToPsz( rDefData.IsHidden() ),
XML_outlineLevelRow, OString::number( maRowBfr.GetHighestOutlineLevel() ).getStr(),
XML_outlineLevelCol, OString::number( maColInfoBfr.GetHighestOutlineLevel() ).getStr(),
FSEND );
diff --git a/sc/source/filter/inc/xetable.hxx b/sc/source/filter/inc/xetable.hxx
index 6354fff38089..12837cac6964 100644
--- a/sc/source/filter/inc/xetable.hxx
+++ b/sc/source/filter/inc/xetable.hxx
@@ -797,6 +797,8 @@ struct XclExpDefaultRowData
explicit XclExpDefaultRowData();
explicit XclExpDefaultRowData( const XclExpRow& rRow );
+ /** Returns true, if rows are hidden by default. */
+ inline bool IsHidden() const { return ::get_flag( mnFlags, EXC_DEFROW_HIDDEN ); }
/** Returns true, if the rows have a manually set height by default. */
inline bool IsUnsynced() const { return ::get_flag( mnFlags, EXC_DEFROW_UNSYNCED ); }
};