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

时间:2014-11-30 04:01:21

标签: java apache merge apache-poi cells

我需要有一个表,第一行和第二行的单元格合并。

这样的事情:

桌子的图像(我不能发布照片)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 个答案:

答案 0 :(得分:3)

似乎还必须删除xml:

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

答案 1 :(得分:1)

要水平/垂直合并,您需要创建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);

b)垂直合并的示例:

 // 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);

答案 2 :(得分:0)

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

对于你的例子,它将是:

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