Apache POI在Word文档中合并表格单元格

5
我需要一个表格,第一行和第二行的单元格需要合并。
类似于这样:
图像表格(我不能发布图片)http://i.stack.imgur.com/dAO6j.png 我一直在查看与此主题相关的所有问题,并找到了一些应用网格跨度到单元格的答案,但我找不到真正的解决方案。
这是我从谷歌和本站获得的示例代码:
    XWPFDocument document = new XWPFDocument();
    XWPFTable table = document.createTable(7, 2);

    fillTable(table);

    XWPFTableCell cellRow1 = table.getRow(0).getCell(0);
    XWPFTableCell cellRow2 = table.getRow(1).getCell(0);

    cellRow1.getCTTc().addNewTcPr();
    cellRow1.getCTTc().getTcPr().addNewGridSpan();
    cellRow1.getCTTc().getTcPr().getGridSpan().setVal(BigInteger.valueOf(2L));

    cellRow2.getCTTc().addNewTcPr();
    cellRow2.getCTTc().getTcPr().addNewGridSpan();
    cellRow2.getCTTc().getTcPr().getGridSpan().setVal(BigInteger.valueOf(2L));

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

我从这段代码中得到的是以下内容:

enter image description here

我尝试使用table.getRow(0).removeCell(1);来移除“多余”的单元格,但是它没有起作用,我做错了什么吗?
3个回答

4

看来XML也必须被删除:

 XWPFTableCell removed = tableRow.getCell(idx);
 removed.getCTTc().newCursor().removeXml();
 tableRow.removeCell(idx);

它确实起作用了,非常感谢。我只需要像这样删除: `cellRow = table3.getRow(0).getCell(2); cellRow.getCTTc().newCursor().removeXml(); cellRow = table3.getRow(0).getCell(1); cellRow.getCTTc().newCursor().removeXml();` - JuanDeLaMora
需要在删除XML之前从表格中移除单元格,否则会发生NPE。 - java-addict301

4
要水平/垂直合并,您需要创建2个CTHMerge并使用setVal:

  • 一个用于保留的单元格(STMerge.RESTART);
  • 第二个用于合并单元格(STMerge.CONTINUE)。

a) 2x2表的水平合并示例:

|___________|___________| --> |___________ ___________|
|___________|___________| --> |___________ ___________|

// First Row
CTHMerge hMerge = CTHMerge.Factory.newInstance();
vmerge.setVal(STMerge.RESTART);
table.getRow(0).getCell(0).getCTTc().getTcPr().setHMerge(hMerge);
table.getRow(1).getCell(0).getCTTc().getTcPr().setHMerge(hMerge);

// Secound Row cell will be merged/"deleted"
CTHMerge hMerge1 = CTHMerge.Factory.newInstance();
hMerge.setVal(STMerge.CONTINUE);
table.getRow(0).getCell(1).getCTTc().getTcPr().setHMerge(hMerge1);
table.getRow(1).getCell(1).getCTTc().getTcPr().setHMerge(hMerge1);
垂直合并示例:
 // First Row
CTVMerge vmerge = CTVMerge.Factory.newInstance();
vmerge.setVal(STMerge.RESTART);
table.getRow(0).getCell(0).getCTTc().getTcPr().setVMerge(vmerge);
table.getRow(0).getCell(1).getCTTc().getTcPr().setVMerge(vmerge);

 // Secound Row cell will be merged 
CTVMerge vmerge1 = CTVMerge.Factory.newInstance();
vmerge.setVal(STMerge.CONTINUE);
table.getRow(1).getCell(0).getCTTc().getTcPr().setVMerge(vmerge1);
table.getRow(1).getCell(1).getCTTc().getTcPr().setVMerge(vmerge1);

这是一个不错的解决方案。但是,如果您计划稍后将docx转换为其他格式,请记住,许多库不支持此标签。 - Ermintar

0

您也可以避免创建额外的单元格,而不是在合并后删除单元格。这需要按顺序添加行和单元格(而不是使用 document.createTable()

对于您的示例,操作步骤如下:

  1. 创建第一行,包含一个单元格并设置文本
  2. 创建下一行,在其中创建新单元格并设置文本
  3. 创建下一行并设置文本
  4. 合并单元格

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接