2013-04-13 113 views

回答

7

如果您已经创建表,行内的桌子和细胞内的行,你可以添加网格扩展到单元格属性:

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 。

4

为每个表格行创建一个单独的XWPFTable将工作,应该是完全正常的。所有的表格都在幕后合并到最终词汇文档中的一个表格中。您将需要所有这些罐子,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)); 
} 
+0

谢谢!精彩地工作。 –

+0

当然,我投了这个答案。我认为我没有办法接受答案,因为我没有问原来的问题。让我知道这是否可行。 –

+0

嗨,我尝试过使用它,它确实正确设置了一个单元格的跨度,但是我留在了表格之外的单元格(右边),等于跨度大小。我试图用XWPFTableRow.removeCell(pos)去除它们。我确认它们在java行对象中被删除,但是当表格呈现并在Word中查看时,它们仍然存在。你知道如何让这些多余的细胞消失吗? –

2

的要合并水平/垂直您需要创建2 CTHMerge并使用SETVAL:

  • 一个,你会留在细胞(STMerge.RESTART);
  • 第二个为合并单元格(STMerge.CONTINUE);

一个)例如用于水平合并2×2表(image with example)

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

// 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)中的垂直例如合并(image with example)

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

你的解决方案适用于我,但我添加了稍加修改,通过添加: 'if(cell.getCTTc()。getTcPr()== null)cell.getCTTc()。addNewTcPr();' – IronRabbit

相关问题