javaapache-poixwpf

How to add a table to header or footer?


I'm having serious trouble adding a new, simple XWPFTable to an XWPFHeader (or Footer). Unfortunately there seems to be only one guy having the same problem (https://bz.apache.org/bugzilla/show_bug.cgi?id=57366#c0).

Does anyone has an approach to achieve this??

  XWPFDocument docx = (XWPFDocument) dockingObject;

  CTSectPr sectPr = docx.getDocument().getBody().addNewSectPr();
  XWPFHeaderFooterPolicy policy = new WPFHeaderFooterPolicy(docx, sectPr);
  XWPFHeader header = policy.createHeader(XWPFHeaderFooterPolicy.DEFAULT);

  // somthing like: header.createTable();

Any help will be more than appreciated!

Kind regard...

~ Daniel


Solution

  • This is possible using public XWPFTable insertNewTbl(org.apache.xmlbeans.XmlCursor cursor).

    Approach: Create a new paragraph in the header. Then get a org.apache.xmlbeans.XmlCursor from the org.openxmlformats.schemas.wordprocessingml.x2006.main.CTP of that paragraph. Then insert the table positioned by that cursor.

    Example:

    import java.io.*;
    import org.apache.poi.xwpf.usermodel.*;
    
    import org.apache.poi.xwpf.model.XWPFHeaderFooterPolicy;
    
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSectPr;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblWidth;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.STTblWidth;
    
    import org.apache.xmlbeans.XmlCursor;
    import java.math.BigInteger;
    
    public class CreateWordHeaderFooterTable {
    
     public static void main(String[] args) throws Exception {
    
      XWPFDocument doc= new XWPFDocument();
    
      // the body content
      XWPFParagraph paragraph = doc.createParagraph();
      XWPFRun run=paragraph.createRun();  
      run.setText("The Body:");
    
      paragraph = doc.createParagraph();
      run=paragraph.createRun();  
      run.setText("Lorem ipsum....");
    
      // create header-footer
      CTSectPr sectPr = doc.getDocument().getBody().addNewSectPr();
      XWPFHeaderFooterPolicy headerFooterPolicy = new XWPFHeaderFooterPolicy(doc, sectPr);
    
      // create header start
      XWPFHeader header = headerFooterPolicy.createHeader(XWPFHeaderFooterPolicy.DEFAULT);
    
      paragraph = header.getParagraphArray(0);
      if (paragraph == null) paragraph = header.createParagraph();
      paragraph.setAlignment(ParagraphAlignment.LEFT);
    
      run = paragraph.createRun();  
      run.setText("The Header:");
    
      // create table in header
      paragraph = header.createParagraph();
      XmlCursor cursor = paragraph.getCTP().newCursor();
      XWPFTable table = header.insertNewTbl(cursor);
      XWPFTableRow row = table.getRow(0); if (row == null) row = table.createRow();
      int twipsPerInch =  1440;
      table.getCTTbl().addNewTblGrid().addNewGridCol().setW(BigInteger.valueOf(6 * twipsPerInch));
      for (int i = 0; i < 3; i++) {
       XWPFTableCell cell = row.getCell(i); if (cell == null) cell = row.createCell();
       CTTblWidth tblWidth = cell.getCTTc().addNewTcPr().addNewTcW();
       tblWidth.setW(BigInteger.valueOf(2 * twipsPerInch));
       tblWidth.setType(STTblWidth.DXA);
       if (cell.getParagraphs().size() > 0) {
        paragraph = cell.getParagraphs().get(0);
       } else {
        paragraph = cell.addParagraph();   
       }
       run = paragraph.createRun();
       run.setText("Header Table Cell " + i);
      }
    
      // create footer start
      XWPFFooter footer = headerFooterPolicy.createFooter(XWPFHeaderFooterPolicy.DEFAULT);
    
      paragraph = footer.getParagraphArray(0);
      if (paragraph == null) paragraph = footer.createParagraph();
      paragraph.setAlignment(ParagraphAlignment.CENTER);
    
      run = paragraph.createRun();  
      run.setText("The Footer:");
      
      FileOutputStream out = new FileOutputStream("CreateWordHeaderFooterTable.docx");
      doc.write(out);
      out.close();
      doc.close();
    
     }
    }