7

在 poi 中创建表格非常简单,但它的教程非常有限,我找不到可以在表格中创建简单合并单元格以生成 docx 文件的教程。

4

3 回答 3

8

如果您已创建表格、表格内的行和行内的单元格,则可以将 gridSpan 添加到单元格属性:

if (cell.getCTTc().getTcPr() == null) cell.getCTTc().addNewTcPr();
if (cell.getCTTc().getTcPr().getGridSpan() == null) cell.getCTTc().getTcPr().addNewGridSpan();
cell.getCTTc().getTcPr().getGridSpan().setVal(2);

注意:单元格是 org.apache.poi.xwpf.usermodel.XWPFTableCell。

于 2013-08-28T14:00:15.297 回答
7

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

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

a) 2x2 表的水平合并示例(带有示例的图像)

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

 // First Row
CTHMerge hMerge = CTHMerge.Factory.newInstance();
hMerge.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();
hMerge1.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();
vmerge1.setVal(STMerge.CONTINUE);
table.getRow(1).getCell(0).getCTTc().getTcPr().setVMerge(vmerge1);
table.getRow(1).getCell(1).getCTTc().getTcPr().setVMerge(vmerge1);
于 2016-12-15T23:10:19.813 回答
5

为每个表格行创建一个单独XWPFTable的行将起作用并且应该非常好。所有表格都在后台合并到最终 Word 文档中的一个表格中。您将需要所有这些罐子poi-3.9.jarpoi-ooxml-3.9.jarpoi-ooxml-schemas-3.9.jar

XWPFTable table1 = document.createTable(1,1); // This is your row 1
XWPFTable table2 = document.createTable(1,3); // This is your row 2

// Now it's time to span each column of table1 and table2 to a span of your choice
// lets say 6 is the total span required assuming there's some row with 6 columns.

spanCellsAcrossRow(table1, 0, 0, 6);
spanCellsAcrossRow(table2, 0, 0, 2);
spanCellsAcrossRow(table2, 0, 1, 2);
spanCellsAcrossRow(table2, 0, 2, 2);

private void spanCellsAcrossRow(XWPFTable table, int rowNum, int colNum, int span) {
    XWPFTableCell  cell = table.getRow(rowNum).getCell(colNum);
    cell.getCTTc().getTcPr().addNewGridSpan();
    cell.getCTTc().getTcPr().getGridSpan().setVal(BigInteger.valueOf((long)span));
}
于 2014-05-14T01:36:13.287 回答