问题描述
在使用XWPFDocument
渲染word表格时,表格的宽度是框架自动适配的,当单元格内文字不多时,各列宽度自适应,但是当单元格内文字过多时,可能会出现下面情况:
右边两列文字过多挤压前面几列
或者这种情况
其他几列直接挤压消失了
想得到的效果:
即每一列格式固定宽度
具体实现
试过在每个单元格cell.setWidth("10%");
但是单元格文字多的话比例还是会失效
不知道是我的用法不对还是这个方法本身就是有问题的
后来查询资料发现 需要在创建table的时候设置:
XWPFTable table = document.createTable(1,8);
table.setTableAlignment(TableRowAlign.CENTER);//表格居中
CTTblPr tblPr = table.getCTTbl().getTblPr();
tblPr.getTblW().setType(STTblWidth.DXA);// 表格固定宽度
tblPr.getTblW().setW(BigInteger.valueOf(14000L));//表格总宽度
CTTblLayoutType layoutType = table.getCTTbl().getTblPr().addNewTblLayout();
layoutType.setType(STTblLayoutType.FIXED);//FIXED:列固定宽度 AUTOFIT:列自动宽度
这一步是设置表格和每列的宽度固定,不会随文字多少自动适配宽度,没有这步的话,就算设置了单元格和表格的宽度也不会生效;
这时候就可以设置每一列的宽度了:
/**
* 设置列宽度(比例)
* @param table 表格
* @param columnIndex 列索引
* @param percentage 列宽度的百分比
* @param totalTableWidth 表格总宽度
*/
private void setTableColumnWidthPercentage(XWPFTable table, int columnIndex, int percentage, int totalTableWidth) {
int columnWidth = Math.round(totalTableWidth * percentage / 100.0f);
XWPFTableCell cell = table.getRow(0).getCell(columnIndex);
CTTcPr tcPr = cell.getCTTc().isSetTcPr() ? cell.getCTTc().getTcPr() : cell.getCTTc().addNewTcPr();
CTTblWidth cellWidth = tcPr.isSetTcW() ? tcPr.getTcW() : tcPr.addNewTcW();
cellWidth.setW(BigInteger.valueOf(columnWidth));
cellWidth.setType(STTblWidth.DXA);
setTableCellWidthTwips(table.getRow(0).getCell(columnIndex), columnWidth);
}
如上是设置每一列的宽度比例;
如果不想设置比例也可以自行修改;
TIPS:
XWPFTableCell groupCell = row.getCell(cellPos);
XWPFParagraph paragraph = groupCell.getParagraphs().get(0);
groupCell.setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);//单元格文字垂直居中
paragraph.setAlignment(ParagraphAlignment.CENTER);//单元格文字水平居中
XWPFRun titleRun= paragraph.createRun();
titleRun.setText("XXX登记表");// 设置文本
titleRun.setFontFamily("Arial");// 设置字体
titleRun.setFontSize(15);// 设置字体大小
titleRun.setBold(true);//加粗