[英]How to merge cells (or apply colspan) using XWPFTable in POI in Java?
在 poi 中创建表格非常简单,但它的教程非常有限,我找不到可以在生成 docx 文件时在表格中创建简单合并单元格的教程。
If you have created table, row inside a table and cell inside a row, you can add gridSpan to cell properties:如果您创建了表格、表格内的行和行内的单元格,您可以将 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);
Note: cell is org.apache.poi.xwpf.usermodel.XWPFTableCell.注意:单元格是 org.apache.poi.xwpf.usermodel.XWPFTableCell。
Creating a separate XWPFTable
for each table row will work and should be perfectly fine.为每个表格行创建一个单独的
XWPFTable
将起作用并且应该完全没问题。 All the tables are merged behind the scenes to one table in the final word document.所有表格在幕后合并到最终 Word 文档中的一张表格中。 You will need all of these jars,
poi-3.9.jar
, poi-ooxml-3.9.jar
and poi-ooxml-schemas-3.9.jar
您将需要所有这些 jar,
poi-3.9.jar
、 poi-ooxml-3.9.jar
和poi-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));
}
To merge horizontally/vertically you need to create 2 CTHMerge and use the setVal:要水平/垂直合并,您需要创建 2 个 CTHMerge 并使用 setVal:
a) example for a horizontal merge for 2x2 table (image with example) : 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) example of a vertical merge (image with example) 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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.