Apache POI XWPFDocument 生成表格时固定列宽度

文章讲述了在使用ApachePOI库的XWPFDocument处理Word表格时,如何确保表格列宽度在文字过多时保持固定,避免列被挤压或消失的问题,通过设置表格全局宽度和列的固定宽度比例来实现这一效果。
摘要由CSDN通过智能技术生成

问题描述

在使用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);//加粗
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值