Kaydet (Commit) ace6bbf3 authored tarafından László Németh's avatar László Németh

tdf#64264 DOCX import: fix row count of repeating table header

by ignoring isolated tblHeader settings, according to the standard.
(OOXML 17.4.49 tblHeader (Repeat Table Row on Every New Page)
"...if this row [with tblHeader property] is not contiguously connected
with the first row of the table (that is, if this table row is not
either the first row, or all rows between this row and the first row
are not marked as header rows) then this property shall be ignored.")

Note: with this fix, in a mixed environment, LibreOffice is able to
fix the known problems of MS Word 2013/2016 by removing the isolated
tblHeaders during DOCX import/export (such problems in MSO: missing
repeating headers in a few pages or in the whole table, despite the
correct settings; and non-modifiable repeat header row property in
the table settings).

Change-Id: I73e8394a75b77c937a4bac37d99ff747ad95a06e
Reviewed-on: https://gerrit.libreoffice.org/60765
Tested-by: Jenkins
Reviewed-by: 's avatarLászló Németh <nemeth@numbertext.org>
üst 62cd8697
...@@ -743,6 +743,23 @@ DECLARE_OOXMLEXPORT_TEST(testTdf118691, "tdf118691.docx") ...@@ -743,6 +743,23 @@ DECLARE_OOXMLEXPORT_TEST(testTdf118691, "tdf118691.docx")
CPPUNIT_ASSERT_EQUAL(OUString("Before\nAfter"), xCell->getString()); CPPUNIT_ASSERT_EQUAL(OUString("Before\nAfter"), xCell->getString());
} }
DECLARE_OOXMLEXPORT_TEST(testTdf64264, "tdf64264.docx")
{
// DOCX table rows with tblHeader setting mustn't modify the count of the
// repeated table header rows, when there is rows before them without tblHeader settings.
xmlDocPtr pDump = parseLayoutDump();
CPPUNIT_ASSERT_EQUAL(2, getPages());
// table starts on page 1 and finished on page 2
// and it has got only a single repeating header line
assertXPath(pDump, "/root/page[2]/body/tab", 1);
assertXPath(pDump, "/root/page[2]/body/tab/row", 47);
CPPUNIT_ASSERT_EQUAL(OUString("Repeating Table Header"),
parseDump("/root/page[2]/body/tab/row[1]/cell[1]/txt/text()"));
CPPUNIT_ASSERT_EQUAL(OUString("Text"),
parseDump("/root/page[2]/body/tab/row[2]/cell[1]/txt/text()"));
}
CPPUNIT_PLUGIN_IMPLEMENT(); CPPUNIT_PLUGIN_IMPLEMENT();
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
...@@ -200,7 +200,7 @@ bool DomainMapperTableManager::sprm(Sprm & rSprm) ...@@ -200,7 +200,7 @@ bool DomainMapperTableManager::sprm(Sprm & rSprm)
case NS_ooxml::LN_CT_TrPrBase_tblHeader: case NS_ooxml::LN_CT_TrPrBase_tblHeader:
// if nIntValue == 1 then the row is a repeated header line // if nIntValue == 1 then the row is a repeated header line
// to prevent later rows from increasing the repeating m_nHeaderRepeat is set to NULL when repeating stops // to prevent later rows from increasing the repeating m_nHeaderRepeat is set to NULL when repeating stops
if( nIntValue > 0 && m_nHeaderRepeat >= 0 ) if( nIntValue > 0 && m_nHeaderRepeat == static_cast<int>(m_nRow) )
{ {
++m_nHeaderRepeat; ++m_nHeaderRepeat;
TablePropertyMapPtr pPropMap( new TablePropertyMap ); TablePropertyMapPtr pPropMap( new TablePropertyMap );
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment