文章时间:2020年12月5日15:12:52 解决问题:java实现word自定义标签替换文本
word 自定义标签替换导出功能,本文档只使用了基础标签替换、表格数据插入、图片替换功能,更多操作请参阅官方文档:http://deepoove.com/poi-tl/#_why_poi_tl
<dependency>
<groupId>com.deepoove</groupId>
<artifactId>poi-tl</artifactId>
<version>1.8.2</version>
</dependency>
此功能还需 Apache POI 4.1.2+
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
最基础的标签为“{{name}}”格式,name为你要替换的字段名,参考下图
表格数据插入,需在你要插入数据行的上一行添加标签,对应后台你要插入的数据的list变量名,然后在插入数据行用“[name]”标签替换list中数据,参考下图
图片替换,需提前在模板中插入图片,然后编辑图片替换文字为对应数据变量名的标签,方法参考下图
需注意图片必须转为指定格式后才可替换,参考代码如下
// 模板文件路径
String templateUrl = "C:\\Users\\dev\\Desktop\\template.docx";
// word文件生成路径
String generateUrl ="C:\\Users\\dev\\Desktop\\generate.docx";
// 此处使用了实体类,本方法也可使用map
ContractDTO dto = new ContractDTO();
// 基本标签替换
dto.setName("某合同");
dto.setDemander("");
dto.setSupplier("乙方");
dto.setCode("编号");
dto.setSignDateStr("日期");
// 表格数据插入
List<ContractProductDTO> list = new ArrayList<>();
ContractProductDTO contractProductDTO = new ContractProductDTO();
contractProductDTO.setName("雪碧");
contractProductDTO.setSpecification("500ml");
contractProductDTO.setUnit("瓶");
contractProductDTO.setAmount("1");
contractProductDTO.setMoney("3");
contractProductDTO.setPrice("3");
list.add(contractProductDTO);
list.add(contractProductDTO);
dto.setProductList(list);
// 图片替换
String imgUrl = "https://fuss10.elemecdn.com/3/63/4e7f3a15429bfda99bce42a18cdd1jpeg.jpeg?imageMogr2/thumbnail/360x360/format/webp/quality/100";
PictureRenderData img = new PictureRenderData(50, 50, ".png", BytePictureUtils.getUrlBufferedImage(imgUrl));
dto.setSignatureWord(img);
// 加载表格配置
HackLoopTableRenderPolicy policy = new HackLoopTableRenderPolicy();
Configure config = Configure.newBuilder()
.bind("productList", policy).build();
// 生成文件
XWPFTemplate template = XWPFTemplate.compile(templateUrl, config).render(dto);
try {
template.writeToFile(generateUrl);
} catch (IOException e) {
e.printStackTrace();
}
生成效果如下