Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ApachePOI-如何将表从一个docx复制到另一个docx_Java_Apache Poi - Fatal编程技术网

Java ApachePOI-如何将表从一个docx复制到另一个docx

Java ApachePOI-如何将表从一个docx复制到另一个docx,java,apache-poi,Java,Apache Poi,您好,我正在尝试将一个表从一个docx文件复制到另一个docx文件,但实际情况是,该表的值在新文档中的表下方被复制,在新文档的表外部,请参见下面的图片 原始docx中的表 新文档中的Talbe 如您所见,表的值被复制到表的外部。 我使用的是Libre Office,ApachePOI版本3.17,我的电脑运行的是Ubuntu 16.04 我用来执行复制的代码如下 public static void copyTable(XWPFDocument input_doc,XWPFDocument o

您好,我正在尝试将一个表从一个docx文件复制到另一个docx文件,但实际情况是,该表的值在新文档中的表下方被复制,在新文档的表外部,请参见下面的图片

原始docx中的表

新文档中的Talbe

如您所见,表的值被复制到表的外部。 我使用的是Libre Office,ApachePOI版本3.17,我的电脑运行的是Ubuntu 16.04

我用来执行复制的代码如下

public static void copyTable(XWPFDocument input_doc,XWPFDocument output_doc,
                             int table_index_input, int table_index_output) {

    XWPFTable template_table = input_doc.getTables().get(table_index_input);

    CTTbl ctTbl = CTTbl.Factory.newInstance(); // Create a new CTTbl for the new table
    ctTbl.set(template_table.getCTTbl()); // Copy the template table's CTTbl
    XWPFTable new_table = new XWPFTable(ctTbl, output_doc); // Create a new table using the CTTbl upon

    output_doc.createParagraph();
    output_doc.createTable();// Create a empty table in the document
    output_doc.setTable(table_index_output, new_table);  // Replace the empty table to table2

}
和copyTable方法

private void copyTable(XWPFTable source, XWPFTable target) {
    target.getCTTbl().setTblPr(source.getCTTbl().getTblPr());
    target.getCTTbl().setTblGrid(source.getCTTbl().getTblGrid());
    for (int r = 0; r<source.getRows().size(); r++) {
        XWPFTableRow targetRow = target.createRow();
        XWPFTableRow row = source.getRows().get(r);
        targetRow.getCtRow().setTrPr(row.getCtRow().getTrPr());
        for (int c=0; c<row.getTableCells().size(); c++) {
            //newly created row has 1 cell
            XWPFTableCell targetCell = c==0 ? targetRow.getTableCells().get(0) : targetRow.createCell();
            XWPFTableCell cell = row.getTableCells().get(c);
            targetCell.getCTTc().setTcPr(cell.getCTTc().getTcPr());
            XmlCursor cursor = targetCell.getParagraphArray(0).getCTP().newCursor();
            for (int p = 0; p < cell.getBodyElements().size(); p++) {
                IBodyElement elem = cell.getBodyElements().get(p);
                if (elem instanceof XWPFParagraph) {
                    XWPFParagraph targetPar = targetCell.insertNewParagraph(cursor);
                    cursor.toNextToken();
                    XWPFParagraph par = (XWPFParagraph) elem;
                    copyParagraph(par, targetPar);
                } else if (elem instanceof XWPFTable) {
                    XWPFTable targetTable = targetCell.insertNewTbl(cursor);
                    XWPFTable table = (XWPFTable) elem;
                    copyTable(table, targetTable);
                    cursor.toNextToken();
                }
            }
            //newly created cell has one default paragraph we need to remove
            targetCell.removeParagraph(targetCell.getParagraphs().size()-1);
        }
    }
    //newly created table has one row by default. we need to remove the default row.
    target.removeRow(0);
}
抄袭段落

private void copyParagraph(XWPFParagraph source, XWPFParagraph target) {
    target.getCTP().setPPr(source.getCTP().getPPr());
    for (int i=0; i<source.getRuns().size(); i++ ) {
        XWPFRun run = source.getRuns().get(i);
        XWPFRun targetRun = target.createRun();
        //copy formatting
        targetRun.getCTR().setRPr(run.getCTR().getRPr());
        //no images just copy text
        targetRun.setText(run.getText(0));
    }
}
和copyTable方法

private void copyTable(XWPFTable source, XWPFTable target) {
    target.getCTTbl().setTblPr(source.getCTTbl().getTblPr());
    target.getCTTbl().setTblGrid(source.getCTTbl().getTblGrid());
    for (int r = 0; r<source.getRows().size(); r++) {
        XWPFTableRow targetRow = target.createRow();
        XWPFTableRow row = source.getRows().get(r);
        targetRow.getCtRow().setTrPr(row.getCtRow().getTrPr());
        for (int c=0; c<row.getTableCells().size(); c++) {
            //newly created row has 1 cell
            XWPFTableCell targetCell = c==0 ? targetRow.getTableCells().get(0) : targetRow.createCell();
            XWPFTableCell cell = row.getTableCells().get(c);
            targetCell.getCTTc().setTcPr(cell.getCTTc().getTcPr());
            XmlCursor cursor = targetCell.getParagraphArray(0).getCTP().newCursor();
            for (int p = 0; p < cell.getBodyElements().size(); p++) {
                IBodyElement elem = cell.getBodyElements().get(p);
                if (elem instanceof XWPFParagraph) {
                    XWPFParagraph targetPar = targetCell.insertNewParagraph(cursor);
                    cursor.toNextToken();
                    XWPFParagraph par = (XWPFParagraph) elem;
                    copyParagraph(par, targetPar);
                } else if (elem instanceof XWPFTable) {
                    XWPFTable targetTable = targetCell.insertNewTbl(cursor);
                    XWPFTable table = (XWPFTable) elem;
                    copyTable(table, targetTable);
                    cursor.toNextToken();
                }
            }
            //newly created cell has one default paragraph we need to remove
            targetCell.removeParagraph(targetCell.getParagraphs().size()-1);
        }
    }
    //newly created table has one row by default. we need to remove the default row.
    target.removeRow(0);
}
抄袭段落

private void copyParagraph(XWPFParagraph source, XWPFParagraph target) {
    target.getCTP().setPPr(source.getCTP().getPPr());
    for (int i=0; i<source.getRuns().size(); i++ ) {
        XWPFRun run = source.getRuns().get(i);
        XWPFRun targetRun = target.createRun();
        //copy formatting
        targetRun.getCTR().setRPr(run.getCTR().getRPr());
        //no images just copy text
        targetRun.setText(run.getText(0));
    }
}

谢谢你的快速回答,但我有一些问题1你传递给函数调用insertNewTbl的参数游标是什么2我需要什么样的导入才能让所有这些都适用于XmlCursor,例如3你能给我提供一些关于你正在使用的XmlCursors的信息吗?另外,还要感谢您在回答中引用的insertNewTbl方法是什么,以及您传递给我的第二个参数是什么,所有内容都已在POI库中。光标是一个。。。怎么说。。。可以应用某些操作的指针。如果您需要在中fo内容中创建表。。。e、 g.在文件第三段之后。但在我们的例子中,光标指向目标单元格的第一段代码非常棒。有没有可能复制单元格中的单词复选框?@golimar没有尝试过复选框。需要调查和复制一些附加属性感谢快速回答,但我有一些问题1您传递给函数调用insertNewTbl的参数游标是什么2我需要什么导入才能使所有这些都适用于XmlCursor,例如3您能为我提供一些关于所有XmlCursor的信息吗使用?另外,还要感谢您在回答中引用的insertNewTbl方法是什么,以及您传递给我的第二个参数是什么,所有内容都已在POI库中。光标是一个。。。怎么说。。。可以应用某些操作的指针。如果您需要在中fo内容中创建表。。。e、 g.在文件第三段之后。但在我们的例子中,光标指向目标单元格的第一段代码非常棒。有没有可能复制单元格中的单词复选框?@golimar没有尝试过复选框。需要调查和复制一些附加属性