diff options
author | Noel Power <noel.power@suse.com> | 2013-01-29 14:51:49 +0000 |
---|---|---|
committer | Noel Power <noel.power@suse.com> | 2013-01-30 18:01:45 +0000 |
commit | b75bf09a5b905a3ed9c251869983a400c70c7fc6 (patch) | |
tree | 35260145cca43389a4ffa3e44f25777f1792a075 /sc | |
parent | 9327467a2c5537613fa59013258532028da9c43b (diff) |
correctly handle repeated row heights for empty rows ( fdo#59973 )
it seems both xls & xlsx export suffer from problems with multiple row heights
repeated ( if those rows are empty )
Change-Id: I3ed68a81517a3e55d1de1954fcb99e7cb39be337
Diffstat (limited to 'sc')
-rw-r--r-- | sc/qa/unit/data/ods/miscemptyrepeatedrowheights.ods | bin | 0 -> 7038 bytes | |||
-rwxr-xr-x | sc/qa/unit/data/xlsx/miscrowheights.xlsx | bin | 0 -> 8522 bytes | |||
-rw-r--r-- | sc/qa/unit/subsequent_export-test.cxx | 74 | ||||
-rw-r--r-- | sc/source/filter/excel/xetable.cxx | 47 | ||||
-rw-r--r-- | sc/source/filter/inc/xetable.hxx | 1 |
5 files changed, 103 insertions, 19 deletions
diff --git a/sc/qa/unit/data/ods/miscemptyrepeatedrowheights.ods b/sc/qa/unit/data/ods/miscemptyrepeatedrowheights.ods Binary files differnew file mode 100644 index 000000000000..5511ad9e99a2 --- /dev/null +++ b/sc/qa/unit/data/ods/miscemptyrepeatedrowheights.ods diff --git a/sc/qa/unit/data/xlsx/miscrowheights.xlsx b/sc/qa/unit/data/xlsx/miscrowheights.xlsx Binary files differnew file mode 100755 index 000000000000..dbdbc137e535 --- /dev/null +++ b/sc/qa/unit/data/xlsx/miscrowheights.xlsx diff --git a/sc/qa/unit/subsequent_export-test.cxx b/sc/qa/unit/subsequent_export-test.cxx index 7b0fde81c8dc..05c48731d1a8 100644 --- a/sc/qa/unit/subsequent_export-test.cxx +++ b/sc/qa/unit/subsequent_export-test.cxx @@ -77,6 +77,7 @@ public: void test(); void testPasswordExport(); void testConditionalFormatExportXLSX(); + void testMiscRowHeightExport(); CPPUNIT_TEST_SUITE(ScExportTest); CPPUNIT_TEST(test); @@ -84,6 +85,7 @@ public: CPPUNIT_TEST(testPasswordExport); #endif CPPUNIT_TEST(testConditionalFormatExportXLSX); + CPPUNIT_TEST(testMiscRowHeightExport); CPPUNIT_TEST_SUITE_END(); private: @@ -297,6 +299,78 @@ void ScExportTest::testConditionalFormatExportXLSX() testCondFile(aCSVPath, pDoc, 0); } +void ScExportTest::testMiscRowHeightExport() +{ + + struct TestParam + { + struct RowData + { + SCROW nStartRow; + SCROW nEndRow; + SCTAB nTab; + int nExpectedHeight; + }; + const char* sTestDoc; + int nImportType; + int nExportType; + int nRowData; + RowData* pData; + }; + + TestParam::RowData DfltRowData[] = + { + { 0, 4, 0, 529 }, + { 5, 10, 0, 1058 }, + { 17, 20, 0, 1767 }, + { 1048573, 1048575, 0, 529 }, + }; + + TestParam::RowData EmptyRepeatRowData[] = + { + { 0, 4, 0, 529 }, + { 5, 10, 0, 1058 }, + { 17, 20, 0, 1767 }, + }; + + TestParam aTestValues[] = + { + { "miscrowheights.", XLSX, XLSX, SAL_N_ELEMENTS(DfltRowData), DfltRowData }, + { "miscrowheights.", XLSX, XLS, SAL_N_ELEMENTS(DfltRowData), DfltRowData }, + { "miscemptyrepeatedrowheights.", ODS, XLSX, SAL_N_ELEMENTS(EmptyRepeatRowData), EmptyRepeatRowData }, + { "miscemptyrepeatedrowheights.", ODS, XLS, SAL_N_ELEMENTS(EmptyRepeatRowData), EmptyRepeatRowData }, + }; + + for ( unsigned int index=0; index<SAL_N_ELEMENTS(aTestValues); ++index ) + { + OUString sFileName = OUString::createFromAscii( aTestValues[ index ].sTestDoc ); + printf("aTestValues[%d] %s\n", index, OUStringToOString( sFileName, RTL_TEXTENCODING_UTF8 ).getStr() ); + int nImportType = aTestValues[ index ].nImportType; + int nExportType = aTestValues[ index ].nExportType; + ScDocShellRef xShell = loadDocument( sFileName, nImportType ); + CPPUNIT_ASSERT(xShell.Is()); + + ScDocShellRef xDocSh = saveAndReload(&(*xShell), nExportType ); + CPPUNIT_ASSERT(xDocSh.Is()); + + ScDocument* pDoc = xDocSh->GetDocument(); + + for (int i=0; i<aTestValues[ index ].nRowData; ++i) + { + SCROW nRow = aTestValues[ index ].pData[ i].nStartRow; + SCROW nEndRow = aTestValues[ index ].pData[ i ].nEndRow; + SCTAB nTab = aTestValues[ index ].pData[ i ].nTab; + int nExpectedHeight = aTestValues[ index ].pData[ i ].nExpectedHeight; + for ( ; nRow <= nEndRow; ++nRow ) + { + printf("\t checking row %d for height %d\n", nRow, nExpectedHeight ); + int nHeight = sc::TwipsToHMM( pDoc->GetRowHeight(nRow, nTab, false) ); + CPPUNIT_ASSERT_EQUAL(nExpectedHeight, nHeight); + } + } + } +} + ScExportTest::ScExportTest() : m_aBaseString(RTL_CONSTASCII_USTRINGPARAM("/sc/qa/unit/data")) { diff --git a/sc/source/filter/excel/xetable.cxx b/sc/source/filter/excel/xetable.cxx index 178acd9c998f..c44b32c1dcfa 100644 --- a/sc/source/filter/excel/xetable.cxx +++ b/sc/source/filter/excel/xetable.cxx @@ -1709,6 +1709,7 @@ XclExpRow::XclExpRow( const XclExpRoot& rRoot, sal_uInt32 nXclRow, mnXFIndex( EXC_XF_DEFAULTCELL ), mnOutlineLevel( 0 ), mnXclRowRpt( 1 ), + mnCurrentRow( nXclRow ), mbAlwaysEmpty( bAlwaysEmpty ), mbEnabled( true ) { @@ -1922,7 +1923,11 @@ void XclExpRow::WriteCellList( XclExpStream& rStrm ) void XclExpRow::Save( XclExpStream& rStrm ) { if( mbEnabled ) - XclExpRecord::Save( rStrm ); + { + mnCurrentRow = mnXclRow; + for ( sal_uInt32 i = 0; i < mnXclRowRpt; ++i, ++mnCurrentRow ) + XclExpRecord::Save( rStrm ); + } } void XclExpRow::InsertCell( XclExpCellRef xCell, size_t nPos, bool bIsMergedBase ) @@ -1951,7 +1956,7 @@ void XclExpRow::InsertCell( XclExpCellRef xCell, size_t nPos, bool bIsMergedBase void XclExpRow::WriteBody( XclExpStream& rStrm ) { - rStrm << static_cast< sal_uInt16 >(mnXclRow) + rStrm << static_cast< sal_uInt16 >(mnCurrentRow) << GetFirstUsedXclCol() << GetFirstFreeXclCol() << mnHeight @@ -1966,23 +1971,27 @@ void XclExpRow::SaveXml( XclExpXmlStream& rStrm ) return; sax_fastparser::FSHelperPtr& rWorksheet = rStrm.GetCurrentStream(); bool haveFormat = ::get_flag( mnFlags, EXC_ROW_USEDEFXF ); - rWorksheet->startElement( XML_row, - XML_r, OString::valueOf( (sal_Int32) (mnXclRow+1) ).getStr(), - // OOXTODO: XML_spans, optional - XML_s, haveFormat ? lcl_GetStyleId( rStrm, mnXFIndex ).getStr() : NULL, - XML_customFormat, XclXmlUtils::ToPsz( haveFormat ), - XML_ht, OString::valueOf( (double) mnHeight / 20.0 ).getStr(), - XML_hidden, XclXmlUtils::ToPsz( ::get_flag( mnFlags, EXC_ROW_HIDDEN ) ), - XML_customHeight, XclXmlUtils::ToPsz( ::get_flag( mnFlags, EXC_ROW_UNSYNCED ) ), - XML_outlineLevel, OString::valueOf( (sal_Int32) mnOutlineLevel ).getStr(), - XML_collapsed, XclXmlUtils::ToPsz( ::get_flag( mnFlags, EXC_ROW_COLLAPSED ) ), - // OOXTODO: XML_thickTop, bool - // OOXTODO: XML_thickBot, bool - // OOXTODO: XML_ph, bool - FSEND ); - // OOXTODO: XML_extLst - maCellList.SaveXml( rStrm ); - rWorksheet->endElement( XML_row ); + mnCurrentRow = mnXclRow + 1; + for ( sal_uInt32 i=0; i<mnXclRowRpt; ++i ) + { + rWorksheet->startElement( XML_row, + XML_r, OString::valueOf( (sal_Int32) (mnCurrentRow++) ).getStr(), + // OOXTODO: XML_spans, optional + XML_s, haveFormat ? lcl_GetStyleId( rStrm, mnXFIndex ).getStr() : NULL, + XML_customFormat, XclXmlUtils::ToPsz( haveFormat ), + XML_ht, OString::valueOf( (double) mnHeight / 20.0 ).getStr(), + XML_hidden, XclXmlUtils::ToPsz( ::get_flag( mnFlags, EXC_ROW_HIDDEN ) ), + XML_customHeight, XclXmlUtils::ToPsz( ::get_flag( mnFlags, EXC_ROW_UNSYNCED ) ), + XML_outlineLevel, OString::valueOf( (sal_Int32) mnOutlineLevel ).getStr(), + XML_collapsed, XclXmlUtils::ToPsz( ::get_flag( mnFlags, EXC_ROW_COLLAPSED ) ), + // OOXTODO: XML_thickTop, bool + // OOXTODO: XML_thickBot, bool + // OOXTODO: XML_ph, bool + FSEND ); + // OOXTODO: XML_extLst + maCellList.SaveXml( rStrm ); + rWorksheet->endElement( XML_row ); + } } // ---------------------------------------------------------------------------- diff --git a/sc/source/filter/inc/xetable.hxx b/sc/source/filter/inc/xetable.hxx index 0138fe2a8221..3a2ec386921f 100644 --- a/sc/source/filter/inc/xetable.hxx +++ b/sc/source/filter/inc/xetable.hxx @@ -938,6 +938,7 @@ private: sal_uInt16 mnXFIndex; /// Default row formatting. sal_uInt16 mnOutlineLevel; /// Outline Level (for OOXML) sal_uInt32 mnXclRowRpt; + sal_uInt32 mnCurrentRow; bool mbAlwaysEmpty; /// true = Do not add blank cells in Finalize(). bool mbEnabled; /// true = Write this ROW record. }; |