当前位置: 首页 > 知识库问答 >
问题:

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

墨阳羽
2023-03-14

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

Talbe在新的docx里

正如您所见,表的值被复制到表的外部。我使用的是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

}

共有2个答案

鲁泰宁
2023-03-14

我认为更简单、更可靠的copyTable函数形式应该是这样的。

private void copyTable(XWPFTable source, XWPFTable target) {
        CTTbl sourceCTTbl = source.getCTTbl();
        CTTbl targetCTTbl = target.getCTTbl();
        targetCTTbl.setTblPr(sourceCTTbl.getTblPr());
        targetCTTbl.setTrArray(sourceCTTbl.getTrArray());
}

(至少对我有用)

马淇
2023-03-14
XWPFTable newTbl = output_doc.insertNewTbl(cursor);
copyTable(table, newTbl);

以及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));
    }
}
 类似资料:
  • 我想将table 1的内容复制到table 2中,但它不是直接复制,因为table 2包含的列比表1多。结构类似于这样: 表 1 { 列 2 列 4 列 6 } 表2{column1 column2 column3 column4 column5 column6} 我想做的是将table1到table2中的每一行相加,并为缺少的列设置默认值。任何帮助都将不胜感激。

  • 您好,我目前正在尝试编写一个结合docx文件的代码。这些文件可能包含文本、图像、表格或方程式。代码旨在复制这些对象并将它们附加到基本docx。我可以使用docx模块的“添加图片”和“添加段落”方法复制和合并文本、图像和表格,但我无法对word公式执行此操作。我决定尝试深入研究docx的xml,并从那里复制等式部分。我可以将公式附加到我的基本文档中,但是当我继续附加图片、文本和表格时,这些公式会显示

  • 问题内容: 我有两个具有相同结构的表。我需要从一个表中选择数据,然后将它们存储到另一个表中。 我怎样才能做到这一点? 问题答案: 因为它们是相同的结构,所以您可以做

  • 问题内容: 我想在MySQL中将数据从一个表复制到另一个表。 表1(现有表): 表2(新表) 我想将一些数据字段从表1复制到表2。 可以使用MySQL查询完成吗? 问题答案: 这将做您想要的: 如果要包括table1中的所有行。否则,如果只想添加table1的子集,则可以在末尾添加WHERE语句。 我希望这有帮助。

  • 问题内容: 我想通过将记录从一张桌子移到另一张桌子来对学生进行归档。这是我尝试使用的代码: 我遇到的问题是我遇到错误: 致命错误:XX行/archive-student.php中的内存不足(已分配80478208)(试图分配80216043字节) 除了有一个名为archive的列并从0更改为1之外,是否有其他方法可以执行此操作?这是因为我有30-50页选择表的记录。:) 问题答案: 就那么简单。

  • 问题内容: 我需要遍历for循环的每次迭代的值集,但仅对于第一次迭代,它可以正常工作。此后返回。 我很清楚这种行为。 一种解决方案是在for循环中调用方法,因此对于每个for循环迭代,都会对其进行初始化。但这是非常无效的方法,因为它是独立的。 我尝试了此方法,但由于它仅包含参考,因此也无法正常工作。 有什么方法可以将迭代器复制到另一个或其他更好的方法中? 问题答案: An 是可能的最小API,可以