diff options
-rw-r--r-- | sw/qa/extras/ooxmlexport/data/tdf58944-repeating-table-header.docx | bin | 0 -> 16640 bytes | |||
-rw-r--r-- | sw/qa/extras/ooxmlexport/ooxmlexport11.cxx | 17 | ||||
-rw-r--r-- | writerfilter/source/dmapper/DomainMapperTableManager.cxx | 22 |
3 files changed, 37 insertions, 2 deletions
diff --git a/sw/qa/extras/ooxmlexport/data/tdf58944-repeating-table-header.docx b/sw/qa/extras/ooxmlexport/data/tdf58944-repeating-table-header.docx Binary files differnew file mode 100644 index 000000000000..56e37362adf7 --- /dev/null +++ b/sw/qa/extras/ooxmlexport/data/tdf58944-repeating-table-header.docx diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport11.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport11.cxx index dd9a6c8ceb12..2f665ad620e5 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport11.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport11.cxx @@ -798,6 +798,23 @@ DECLARE_OOXMLEXPORT_TEST(testLOPresetDashesConvert, "lo_preset_dashes.odt") assertXPath(pXmlDoc, "/w:document/w:body/w:p/w:r/mc:AlternateContent[10]/mc:Choice/w:drawing/wp:anchor/a:graphic/a:graphicData/wps:wsp/wps:spPr/a:ln/a:prstDash", "val", "sysDash"); } +DECLARE_OOXMLEXPORT_TEST(testTdf58944RepeatingTableHeader, "tdf58944-repeating-table-header.docx") +{ + // DOCX tables with more than 10 repeating header lines imported without repeating header lines + // as a workaround for MSO's limitation of header line repetition + xmlDocPtr pDump = parseLayoutDump(); + CPPUNIT_ASSERT_EQUAL(2, getPages()); + + // table starts on page 1 and finished on page 2 + // instead of showing only a part of it on page 2 + assertXPath(pDump, "/root/page[1]/body/tab", 1); + assertXPath(pDump, "/root/page[1]/body/tab/row", 11); + CPPUNIT_ASSERT_EQUAL(OUString("Test1"), + parseDump("/root/page[2]/body/tab/row[1]/cell[1]/txt/text()")); + CPPUNIT_ASSERT_EQUAL(OUString("Test2"), + parseDump("/root/page[2]/body/tab/row[2]/cell[1]/txt/text()")); +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/writerfilter/source/dmapper/DomainMapperTableManager.cxx b/writerfilter/source/dmapper/DomainMapperTableManager.cxx index f76f28dcac1f..962f7130e6f9 100644 --- a/writerfilter/source/dmapper/DomainMapperTableManager.cxx +++ b/writerfilter/source/dmapper/DomainMapperTableManager.cxx @@ -203,9 +203,27 @@ bool DomainMapperTableManager::sprm(Sprm & rSprm) // to prevent later rows from increasing the repeating m_nHeaderRepeat is set to NULL when repeating stops if( nIntValue > 0 && m_nHeaderRepeat == static_cast<int>(m_nRow) ) { - ++m_nHeaderRepeat; TablePropertyMapPtr pPropMap( new TablePropertyMap ); - pPropMap->Insert( PROP_HEADER_ROW_COUNT, uno::makeAny( m_nHeaderRepeat )); + + // Repeating header lines are not visible in MSO, if there is no space for them. + // OOXML (and ODF) standards don't specify this exception, and unfortunately, + // it's easy to create tables with invisible repeating headers in MSO, resulting + // OOXML files with non-standardized layout. To show the same or a similar layout + // in LibreOffice (instead of a broken table with invisible content), we use a + // reasonable 10-row limit to apply header repetition, as a workaround. + // Later it's still possible to switch on header repetition or create a better + // compatible repeating table header in Writer for (pretty unlikely) tables with + // really repeating headers consisted of more than 10 table rows. + if ( m_nHeaderRepeat == 10 ) + { + m_nHeaderRepeat = -1; + pPropMap->Insert( PROP_HEADER_ROW_COUNT, uno::makeAny(sal_Int32(0))); + } + else + { + ++m_nHeaderRepeat; + pPropMap->Insert( PROP_HEADER_ROW_COUNT, uno::makeAny( m_nHeaderRepeat )); + } insertTableProps(pPropMap); } else |