2017-04-07 3 views
0

Ich möchte eine Tabelle in eine Zelle einfügen, ich habe eine Demo aber Misserfolg, kann jemand einen Rat geben?Wie Einfügen einer Tabelle in eine Zelle in Poi-Wort?

XWPFDocument document = new XWPFDocument(); 
    XWPFTable tableTwo = document.createTable(1,1); 
    XWPFTableRow tableTwoRow1 = tableTwo.getRow(0); 
    tableTwoRow1.getCell(0).setText("aaaaaaaaaa"); 
    XWPFTable tableOne = document.createTable(2,2); 
    XWPFTableRow tableOneRow1 = tableOne.getRow(0); 
    XWPFTableRow tableOneRow2 = tableOne.getRow(1); 
    tableOneRow1.getCell(0).setText("Test"); 
    tableOneRow1.getCell(1).setText("Test"); 
    tableOneRow2.getCell(0).setText("Test"); 
    tableOneRow2.getCell(1).insertTable(0, tableTwo); 
    FileOutputStream fos = new FileOutputStream("D:\\2.docx"); 
    document.write(fos); 
    fos.close(); 
+1

Was bedeutet "aber Versagen"? Jede Ausnahme oder was? – Jens

+0

gibt es keine Ausnahme, aber die TabelleTwo nicht in der TabelleOne eingefügt, TableTwo neben TableOne anhängen. – Sucy

+1

Kannst du bitte ein [mcve] erstellen? – Jens

Antwort

2

Die XWPFTable erstellt XWPFDocument.createTable verwendet, wird auf das Dokument immer gehört. So kann es später nicht aus dem Dokument entnommen und in eine Zelle gesteckt werden.

Dafür wird XWPFTableCell.insertNewTbl benötigt.

Der folgende Code funktioniert tatsächlich apache poi Versionen mit:

import java.io.*; 

import org.apache.poi.xwpf.usermodel.*; 

public class CreateWordTableInTable { 

public static void main(String[] args) throws Exception { 

    XWPFDocument document = new XWPFDocument(); 

    XWPFTable tableOne = document.createTable(2,2); 
    XWPFTableRow tablerow = tableOne.getRow(0); 
    tablerow.getCell(0).setText("Test"); 
    tablerow.getCell(1).setText("Test"); 

    tablerow = tableOne.getRow(1); 
    tablerow.getCell(0).setText("Test"); 

    XWPFParagraph paragraph = tablerow.getCell(1).getParagraphArray(0); 
    XWPFTable tableTwo = tablerow.getCell(1).insertNewTbl(paragraph.getCTP().newCursor()); 

    tableTwo.getCTTbl().addNewTblPr().addNewTblBorders().addNewLeft().setVal(
    org.openxmlformats.schemas.wordprocessingml.x2006.main.STBorder.SINGLE); 
    tableTwo.getCTTbl().getTblPr().getTblBorders().addNewRight().setVal(
    org.openxmlformats.schemas.wordprocessingml.x2006.main.STBorder.SINGLE); 
    tableTwo.getCTTbl().getTblPr().getTblBorders().addNewTop().setVal(
    org.openxmlformats.schemas.wordprocessingml.x2006.main.STBorder.SINGLE); 
    tableTwo.getCTTbl().getTblPr().getTblBorders().addNewBottom().setVal(
    org.openxmlformats.schemas.wordprocessingml.x2006.main.STBorder.SINGLE); 
    tableTwo.getCTTbl().getTblPr().getTblBorders().addNewInsideH().setVal(
    org.openxmlformats.schemas.wordprocessingml.x2006.main.STBorder.SINGLE); 
    tableTwo.getCTTbl().getTblPr().getTblBorders().addNewInsideV().setVal(
    org.openxmlformats.schemas.wordprocessingml.x2006.main.STBorder.SINGLE); 

    tablerow = tableTwo.createRow(); 
    tablerow.createCell().setText("aaaaaaaaaa"); 
    tablerow.createCell().setText("jjjjjjjj"); 
    tablerow = tableTwo.createRow(); 
    tablerow.getCell(0).setText("bbbbbbbbbb"); 
    tablerow.getCell(1).setText("gggggggggg"); 

    document.write(new FileOutputStream("CreateWordTableInTable.docx")); 
    document.close(); 

} 
} 

Aber ich würde empfehlen, diesen Ansatz nicht zu verwenden, sondern fusionierten Zellen stattdessen zu verwenden. Tabellen, die in Tabellenzellen enthalten sind, sind hässlich. Dies gilt sowohl für HTML als auch für Word sowie für alle anderen Textdokumentformate, die Tabellen enthalten können.

+0

Sie haben recht, 'XWPFTableCell.insertNewTable()' war meine eigene Methode, keine in POI. – jmarkmurphy

+0

Ich habe Ihren Code getestet, TableTwo kann wirklich erfolgreich eingefügt werden. Aber ich möchte wissen, warum tableTwo keine Grenze hat? – Sucy

+0

Das 'tableTwo' hat keinen Rahmen, da 'apache poi' es nicht automatisch mit' insertNewTbl' einstellt. Sie müssen es also bei Bedarf manuell einstellen. Ich werde meinen Code aktualisieren, um zu zeigen, wie. Aber wie gesagt, die Verwendung von verbundenen Zellen in ** einer ** Tabelle anstelle von geschachtelten Tabelle wäre der bessere Ansatz. –

Verwandte Themen