Tablecell中的表 - 使用Apache POI的嵌套表

时间:2015-08-21 11:26:41

标签: java apache-poi

您好我正在使用apache POI,我必须用它创建docx文件。 现在我迭代一个html文档并获取标签以创建一个有效的docx文档。

当我在tablecell中有一个表时,无法显示正确的表。

<table>
    <tr>
        <td style="text-align: left">Status</td>
        <td>
            <table>
                <tr>
                    <td>test</td>
                </tr>
            </table>
        </td>
    </tr>
</table>

使用docx中的嵌套表加载正确的文件没有问题。

     FileOutputStream fos = null;
            XWPFDocument document = null;
            try {
                fos = new FileOutputStream(docRes);
                if (fileType == docType.DOCX) {
                    try {
                        String fileName = "D:\\test.docx";

                        if (!(fileName.endsWith(".doc") || fileName.endsWith(".docx"))) {
                            throw new FileFormatException();
                        } else {
                            XWPFDocument doc = new XWPFDocument(new FileInputStream(fileName));
                            List<XWPFTable> table = doc.getTables();

                        }
                    }
                }
            }

当我再次保存此文件时,我在带有POI的Word中获得了一个嵌套表。

但是如何在不加载正确的docx文件的情况下创建嵌套表?

我检查了很多选项,但已经很简单的解决方案不起作用。

            document = new XWPFDocument();
            XWPFTable tableOne = document.createTable();
            XWPFTableRow tableOneRow1 = tableOne.getRow(0);
            XWPFTableRow tableOneRow2 = tableOne.createRow();
            tableOneRow1.getCell(0).setText("Test");
            tableOneRow1.addNewTableCell();
            tableOneRow1.getCell(1).setText("Test");
            tableOneRow2.getCell(0).setText("Test");
            tableOneRow2.addNewTableCell();
            tableOneRow2.getCell(1).setText("include nestedTable");

            XWPFTable tableTwo = document.createTable();
            XWPFTableRow tableTwoRow1 = tableTwo.getRow(0);
            tableTwoRow1.getCell(0).setText("Test");
            tableTwoRow1.addNewTableCell();
            tableTwoRow1.getCell(0).setText("nestedTable");

            tableOneRow2.getCell(1).insertTable(0, tableTwo);

来自docx的direclty加载变量的不同之处在于,在自制解决方案中,文档在文档根目录中有两个表。

如何构建嵌套表?

谢谢

菲利克斯希望

2 个答案:

答案 0 :(得分:0)

我没有对此进行过测试,但您可能需要查看XWPFTableCell类的文档 方法public void insertTable(int pos,XWPFTable table)似乎正是您所寻找的。

答案 1 :(得分:0)

link之后,它可能是这样的:

    public static void main(String[] args) throws Exception {
    FileOutputStream out = new FileOutputStream(new File("word.docx"));
    XWPFDocument document = new XWPFDocument();
    XWPFTable tableOne = document.createTable();
    XWPFTableRow tableOneRow1 = tableOne.getRow(0);
    XWPFTableRow tableOneRow2 = tableOne.createRow();
    tableOneRow1.getCell(0).setText("Test11");
    tableOneRow1.addNewTableCell();
    tableOneRow1.getCell(1).setText("Test12");
    tableOneRow2.getCell(0).setText("Test21");
    tableOneRow2.addNewTableCell();

    XWPFTableCell cell = tableOneRow2.getCell(1);
    CTTbl ctTbl = cell.getCTTc().addNewTbl();
    ctTbl = cell.getCTTc().addNewTbl();
    CTTblPr tblPr = ctTbl.addNewTblPr();
    cell.removeParagraph(0);
    cell.getCTTc().addNewP();

    XWPFTable tableTwo = new XWPFTable(ctTbl,cell);
    XWPFTableRow tableTwoRow1 = tableTwo.getRow(0);
    tableTwoRow1.getCell(0).setText("nestedTable11");
    tableTwoRow1.addNewTableCell();
    tableTwoRow1.getCell(1).setText("nestedTable12");

    document.write(out);
    out.close();
}

或使用insertNewTbl(XmlCursor cursor)方法:

        XWPFParagraph paragraph = tablerow.getCell(1).getParagraphs().get(0);
    XmlCursor cursor = paragraph.getCTP().newCursor();
    XWPFTable tableTwo = tablerow.getCell(1).insertNewTbl(cursor);