java实现word自定义标签替换文本

2022-05-28 10:25:06 浏览数 (2)

文章时间:2020年12月5日15:12:52 解决问题:java实现word自定义标签替换文本

word 自定义标签替换导出功能,本文档只使用了基础标签替换、表格数据插入、图片替换功能,更多操作请参阅官方文档:http://deepoove.com/poi-tl/#_why_poi_tl

第一步 添加 maven

代码语言:javascript复制
<dependency>
  <groupId>com.deepoove</groupId>
  <artifactId>poi-tl</artifactId>
  <version>1.8.2</version>
</dependency>

此功能还需 Apache POI 4.1.2

代码语言:javascript复制
<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>

第二步 构建 word 模板文件

最基础的标签为“{{name}}”格式,name为你要替换的字段名,参考下图

表格数据插入,需在你要插入数据行的上一行添加标签,对应后台你要插入的数据的list变量名,然后在插入数据行用“[name]”标签替换list中数据,参考下图

图片替换,需提前在模板中插入图片,然后编辑图片替换文字为对应数据变量名的标签,方法参考下图

第三步 编写后台代码

需注意图片必须转为指定格式后才可替换,参考代码如下

代码语言:javascript复制
        // 模板文件路径
        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();
        }

生成效果如下

0 人点赞