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

tdf#58944 DOCX import: workaround for hidden table headers

Repeating table headers consisted of more than 10 table rows
switch off table header repetition during DOCX table import
to fix non-visible table content and broken tables.

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.

Note: This workaround could help to create standard and more portable OOXML
files in a mixed environment.

Change-Id: I17fbc0173ec1c4f188a46227b99dde5726530da3
Reviewed-on: https://gerrit.libreoffice.org/60689
Tested-by: Jenkins
Reviewed-by: 's avatarLászló Németh <nemeth@numbertext.org>
üst 26070127
...@@ -798,6 +798,23 @@ DECLARE_OOXMLEXPORT_TEST(testLOPresetDashesConvert, "lo_preset_dashes.odt") ...@@ -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"); 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(); CPPUNIT_PLUGIN_IMPLEMENT();
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
...@@ -203,9 +203,27 @@ bool DomainMapperTableManager::sprm(Sprm & rSprm) ...@@ -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 // 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) ) if( nIntValue > 0 && m_nHeaderRepeat == static_cast<int>(m_nRow) )
{ {
++m_nHeaderRepeat;
TablePropertyMapPtr pPropMap( new TablePropertyMap ); 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); insertTableProps(pPropMap);
} }
else else
......
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