下面的代码有问题:
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
指针复制到它的内部行列表。此外,我在更改已存在的行时也没有遇到问题。你知道为什么会这样吗?
若要重现此问题,请在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?我不确定我该怎么做 当我尝试执行此操作时
我想创建一个包含xml文件的zip文件夹并下载它。我可以下载zip,但它是空的。 我可以创建xml和zip: 顺便说一下,$result是ArrayToXML::CONVERT(array,....) 如何将xml文件添加到ZIP。我刚来拉拉维尔请帮帮我
我在这个论坛上尝试了几种解决方案,但我无法添加要提交的文件。我使用的是,但我的git bash只是冻结了。我已经删除了索引。锁定文件。似乎每次我运行git add-A时都会创建它,但什么也没发生。它只是坐在那里,有一个闪烁的光标。我升级了我的git bash,重新初始化了我的项目,但仍然是相同的问题。我尝试了以下线程和类似线程中的许多解决方案: 另一个git进程似乎正在这个存储库中运行 完全错误: