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

将行添加到表中后,无法更改。docx文件中的行文本

夏青青
2023-03-14

下面的代码有问题:

XWPFTable table = <get table somehow>;
CTRow firstRow = table.getRow(0).getCtRow();

for (int i = 0; i < data.getRowCount(); i++) {
    CTRow ctRow = (CTRow) firstRow.copy();
    XWPFTableRow row = new XWPFTableRow(ctRow, table);
    XWPFRun[] cellRuns = row.getTableCells()
            .stream()
            .map(c -> c.getParagraphs().get(0))
            .map(p -> p.getRuns().isEmpty() ? p.createRun() : p.getRuns().get(0))
            .toArray(XWPFRun[]::new);
    for (int j = 0; j < cellRuns.length; j++) {
        cellRuns[j].setText(data.getValueAt(i, j).toString(), 0);
    }
    table.addRow(row);
}


table.getRow(1).getTableCells()
.get(0).getParagraphs()
.get(0).getRuns()
.get(0).setText("FooBar", 0); //change text in some added row

此代码多次复制表的第一行,然后从data复制值。工作非常好(除了文本样式),除了最后一个操作符,它应该改变一些添加的表格行中的文本。此外,“foobar”字符串甚至不会出现在创建的WORD文档的document.xml中。我没有从debug中看到任何线索,因为table.addrow(row);操作符似乎只是将row指针复制到它的内部行列表。此外,我在更改已存在的行时也没有遇到问题。你知道为什么会这样吗?

共有1个答案

漆雕彦
2023-03-14

若要重现此问题,请在source.docx中设置第一个表,该表至少有两行。

然后运行以下代码:

import java.io.FileInputStream;
import java.io.FileOutputStream;
import org.apache.poi.xwpf.usermodel.*;

import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTRow;

public class WordInsertTableRow {

 static XWPFTableRow insertNewTableRow(XWPFTableRow sourceTableRow, int pos) throws Exception {
  XWPFTable table = sourceTableRow.getTable();
  CTRow newCTRrow = CTRow.Factory.parse(sourceTableRow.getCtRow().newInputStream());
  XWPFTableRow tableRow = new XWPFTableRow(newCTRrow, table);
  table.addRow(tableRow, pos);
  return tableRow;
 }

 static void commitTableRows(XWPFTable table) {
  int rowNr = 0;
  for (XWPFTableRow tableRow : table.getRows()) {
   table.getCTTbl().setTrArray(rowNr++, tableRow.getCtRow());
  }
 }

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

  XWPFDocument doc = new XWPFDocument(new FileInputStream("source.docx"));
  boolean weMustCommitTableRows = false;

  XWPFTable table = doc.getTableArray(0);

  // insert new row, which is a copy of row 2, as new row 3:
  XWPFTableRow sourceTableRow = table.getRow(1);
  XWPFTableRow newRow3 = insertNewTableRow(sourceTableRow, 2);

  // now changing something in that new row:
  int i = 1;
  for (XWPFTableCell cell : newRow3.getTableCells()) {
   for (XWPFParagraph paragraph : cell.getParagraphs()) {
    for (XWPFRun run : paragraph.getRuns()) {
     run.setText("New row 3 run " + i++, 0);
    }
   }
  }
System.out.println(newRow3.getCtRow()); // was changed
System.out.println(table.getRow(2).getCtRow()); // even this is changed
System.out.println(table.getCTTbl().getTrArray(2)); // but this was not changed, why not?
  weMustCommitTableRows = true;

  if (weMustCommitTableRows) commitTableRows(table); // now it is changed

  FileOutputStream out = new FileOutputStream("result.docx");
  doc.write(out);
  out.close();
  doc.close();

 }
}

此代码创建第二行的副本,并将其作为表中的第三行插入。然后它确实在新的第三排改变了一些东西。

 类似资料:
  • 我正在使用Apache POI处理。docx文件。 我试着把这个例子做得尽可能少。谢谢你的帮助!

  • 我刚开始在我的JAVAFX项目中使用RichTextFX。但是我发现我无法将文本添加到InlineCssTextArea。在项目中,我使用MVC设计并从Scene Builder生成UI代码。InlineCssTextArea已成功创建,但我无法弄清楚为什么我不能添加文本内容。程序成功编译,没有错误。但是InlineCssTextArea默认为空。 我已经在Github上阅读了RichTextFX

  • 问题内容: 我想知道在xhtml 1.0中有哪些严格选项可以在像这样的文本两边都创建一行: 我曾想过做一些像这样的幻想: 或者,因为上述内容在对齐方面存在问题(垂直和水平对齐): 这也有对齐问题,我可以用这个烂摊子解决: 除了对齐问题之外,这两个选项都让人感到“前途未卜”,如果您碰巧曾经见过这一点并且知道一个优雅的解决方案,我将非常感激。 问题答案: 我不知道这是否已经解决,但是flexbox提供

  • 问题内容: 我不得不问这个问题而感到非常恼火,但我无法解决它。目前,我有一个项目: src /文件夹中的5个类 2个JARS在根文件夹中分别名为profiles.jar和classifier.jar 我想创建一个“ makefile”吗?或“批处理文件?” 从WINDOWS COMMAND LINE 编译并运行这些类,但首先将jar添加到buildpath?我不确定我该怎么做 当我尝试执行此操作时

  • 问题内容: 只是想出如何在一个文本中实现多行文本。似乎的默认值与(一行)相同,但是我找不到符合此条件的任何函数。 编辑 ,做到了。但是,例如,可以不设置特定的数量。只有0? 问题答案: 使用限制文本行的数量。它以可选的Int()作为参数,并允许无限制的行。 编辑 :自SwiftUI Beta 5起,默认行数限制为,因此默认情况下,文本将自动换行。

  • 我想创建一个包含xml文件的zip文件夹并下载它。我可以下载zip,但它是空的。 我可以创建xml和zip: 顺便说一下,$result是ArrayToXML::CONVERT(array,....) 如何将xml文件添加到ZIP。我刚来拉拉维尔请帮帮我