Java操作Word('docx'), 填充模板文件并转为pdf
1. pom相关依赖工具poi-tl (操作word文档模板) + jacob (将操作后的word模板转为pdf)
com.deepoove
poi-tl
1.9.1
com.jacob
jacob
1.17
system
${project.basedir}/src/main/resources/lib/jacob.jar
2. 对word模板进行插入数据操作使用poi-tl操作word需要创建一个用于向word插入数据的Map集合, word模板中标签格式为"{ {标签}}", 其中标签内容为Map 的key.
// 项目根路径
String abPath = new File("").getAbsolutePath() + "/src/main/resources";
// 创建用于插入数据的Map
Map map = new HashMap<>();
map.put(, );
...
// 填充word文档
XWPFTemplate template = XWPFTemplate.compile(abPath + "").render(map);
// 输出文档
template.writeAndClose(new FileOutPutStream(""));
3. 对word模板的表格执行插入数据操作(动态表格)使用poi-tl操作word的表格,动态的插入数据,需要用到poi-tl的可选插件进行自定义渲染策略, 首先在word需要操作的表格中的任意单元格添加标签“{ {标签}}”
自定义渲染策略/**
* 自定义渲染策略
*
* @author
*/
public class DetailTablePolicy extends DynamicTableRenderPolicy {
// 表格起始行行数
int tableStartRow = 1;
/**
* 自定义渲染策略
*
* @data 传入的封装好的数据
*/
@Override
public void render(XWPFTable table, Object data) throws Exception {
// 如果数据为空,直接返回
if (null == data) return;
// 封装数据List的数据封装对象
NdrwhkhzbData detailData = (NdrwhkhzbData) data;
// 获取当前列表行高
int height = table.getRow(2).getHeight();
// 从封装对象中获取数据集合
List datas = detailData.getNdrwhkhzbs();
if (null != datas) {
// 循环移除空白表格中数据数量的空白行
for (int i = 1; i
table.removeRow(i);
}
// 循环插入数据
for (int i = 0; i
// 新增一行空白行
XWPFTableRow insertNewTableRow = table.insertNewTableRow(tableStartRow);
// 设置行高
insertNewTableRow.setHeight(height);
// 循环添加单元格(4为每行单元格数量)
for (int j = 0; j
insertNewTableRow.createCell();
}
// 填充表格
TableRenderPolicy.Helper.renderRow(table.getRow(tableStartRow), datas.get(i));
}
}
}
}把自定义渲染策略当做工具类, 在主逻辑中直接配置使用/**
* 操作年度任务和考核指标表
*
* @throws IOException 输入输出流异常
*/
private void createNdrwhkhzb(Integer uid, String dirPath) throws IOException {
PageData datas = new PageData();
NdrwhkhzbData detailTable = new NdrwhkhzbData();
List nds = new ArrayList<>();
// 根据uid查询年度任务和考核指标数据
List list = ndrwhkhzbService.selectNdrwhkhzbByUid(uid);
for (NdrwhkhzbEntity ndrwhkhzbEntity : list) {
RowRenderData rrd = Rows.of(ndrwhkhzbEntity.getNd(), ndrwhkhzbEntity.getNdrw(), ndrwhkhzbEntity.getNdkhzb()
, ndrwhkhzbEntity.getZyrwdsjjd()).center().create();
nds.add(rrd);
}
detailTable.setNdrwhkhzbs(nds);
datas.setNdrwhkhzbData(detailTable);
// 配置表格
Configure config = Configure.builder().bind("detail_table", new DetailTablePolicy()).build();
// 调用渲染策略进行填充
XWPFTemplate template =
XWPFTemplate.compile(dirPath + "/" + uid + "_Complete.docx", config).render(datas);
// 写入表格中
template.writeToFile(dirPath + "/" + uid + "_Complete.docx");
}用到的一些实体类// PageData
public class PageData {
@Name("detail_table")
private N