java—在.docx表中复制和变异行

ppcbkaq5  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(418)

我正在使用ApachePOI处理.docx文件。
我有一个1行1列的.docx表。

XWPFTable table = document.getTables().get(0);
XWPFTableRow copiedRow = table.getRow(0);
table.addRow(copiedRow);

上面的代码成功地复制了行,因此表现在将有2行。
但是,我还想对复制的行进行变异。

XWPFTable table = document.getTables().get(0);
XWPFTableRow copiedRow = table.getRow(0);
copiedRow.getTableCells().get(0).setText("SOME MODIFICATION HERE"); // <- setting some data
table.addRow(copiedRow);

问题是。。。修改影响了两行。原来的第一个和第二个刚刚被添加的都会受到影响。
我还尝试显式构造新行,如下所示:

copiedRow.getTableCells().get(0).setText("SOME MODIFICATION");
XWPFTableRow newRow = new XWPFTableRow(copiedRow.getCtRow(), table);
table.addRow(newRow);

…但是结果仍然是一样的:两行都被修改,而不仅仅是第二行。
我试着尽可能少举这个例子。谢谢你的帮助!

nfg76nw0

nfg76nw01#

您仍在引用相同的基础数据。 CTRow 有一个 copy 方法。所以用它来创建一个新的 XWPFTableRow :

import org.apache.poi.xwpf.usermodel.*;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTRow;

import java.io.*;
import java.nio.file.*;

public class Main {
    public static void main(String[] args) throws IOException {
        Path documentRoot = Paths.get(System.getProperty("user.home"), "Documents");
        try (InputStream inputStream = Files.newInputStream(documentRoot.resolve("Input.docx"))) {
            XWPFDocument document = new XWPFDocument(inputStream);
            XWPFTable table = document.getTables().get(0);
            XWPFTableRow row = table.getRow(0);
            XWPFTableRow copiedRow = new XWPFTableRow((CTRow) row.getCtRow().copy(), table);
            copiedRow.getTableCells().get(0).setText("SOME MODIFICATION HERE");
            table.addRow(copiedRow);
            try (OutputStream outputStream = Files.newOutputStream(documentRoot.resolve("Output.docx"))) {
                document.write(outputStream);
            }
        }
    }
}

相关问题