如何生成word文档官网有描述,这里主要讨论表格样式和合并单元格的问题。
样式
这段是官网在表格中插入行的代码,但是这样并不能保留表格的样式;
// 插入行
XWPFTableRow insertNewTableRow = table.insertNewTableRow(laborsStartRow);
for (int j = 0; j < 7; j++) insertNewTableRow.createCell();
// 单行渲染
TableRenderPolicy.Helper.renderRow(table.getRow(laborsStartRow), labors.get(i));
我们可以复制word模板中的其中一行的样式。
//样式
XWPFTableRow tableRow = table.getRow(start);
CTRow ctrow = CTRow.Factory.parse(tableRow.getCtRow().newInputStream());
//根据模板行生成带样式的一行
XWPFTableRow addRow = new XWPFTableRow(ctrow, table);
//将数据渲染到这一行(如果模板行没有字会报错)
String[] fields = list.get(i).getRow();
for (int k = 0; k < fields.length; k++) {
XWPFTableCell cell = addRow.getTableCells().get(k);
cell.getParagraphs().get(0).getRuns().get(0).setText(fields[k], 0);
}
//插入表格
table.addRow(addRow, start + i);
合并单元格
官网中合并单元格的方法我试了没有作用,这里提供两种方式。
第一种word和wps都能正常显示,水平合并是HMerge,竖直合并是VMerge
//合并第0列
if (k == 0) {
if (i == 0) //是否为合并开始行
{
CTVMerge ctvMerge = CTVMerge.Factory.newInstance();
ctvMerge.setVal(STMerge.RESTART);
cell.getCTTc().getTcPr().setVMerge(ctvMerge);
} else {
CTVMerge ctvMerge = CTVMerge.Factory.newInstance();
ctvMerge.setVal(STMerge.CONTINUE);
cell.getCTTc().getTcPr().setVMerge(ctvMerge);
}
}
第二种word显示会有问题,wps正常
//合并第0列
if (k == 0) {
/*if (i == 0) //这段加上word会没有合并效果,wps显示正常
cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART);
else */
cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.CONTINUE);
}
参考文档: