Search code examples
c#.net-4.5openxmlopenxml-sdkwordprocessingml

keep table(rows) together with OpenXML SDK 2.5


I'd like to generate multiple tables with 2 rows each inside of a word document. But I want to keep these two rows together (if possible).

  1. new KeepNext()on the first row doesn't work
  2. new KeepNext()on the last paragraph of the first row doesn't work
  3. new CantSplit() on the table doesn't work

In all cases the second row (if too large) lands on the second page. A new CantSplit() on the last cell ( the one with large content) avoids a break of the cell. But none of the options avoids a split of the table (rowwise).


Solution

  • You need to add a KeepNext to each row to keep them together. The XML output in document.xml should be something akin to:

    enter image description here

    This code successfully creates a table with 2 rows that will stay together across pages:

    Table table = wordDoc.MainDocumentPart.Document.Body.AppendChild(new Table());
    
    TableRow row1 = table.AppendChild(new TableRow());
    TableCell cell1 = row1.AppendChild(new TableCell());
    Paragraph para1 = cell1.AppendChild(new Paragraph());
    PreviousParagraphProperties prop1 = para1.AppendChild(new PreviousParagraphProperties());
    KeepNext k = prop1.AppendChild(new KeepNext());
    Run run1 = para1.AppendChild(new Run());
    run1.AppendChild(new Text("This is some long text"));
    
    TableRow row2 = table.AppendChild(new TableRow());
    TableCell cell2 = row2.AppendChild(new TableCell());
    Paragraph para2 = cell2.AppendChild(new Paragraph());
    PreviousParagraphProperties prop2 = para1.AppendChild(new PreviousParagraphProperties());
    KeepNext k2 = prop2.AppendChild(new KeepNext());
    Run run2 = para2.AppendChild(new Run());
    run2.AppendChild(new Text("This is some even longer text"));