ETJava Beta | Java    注册   登录
  • poi读取word模板并生成新的模板 案例1

    发表于 2024-07-04 01:57:17     阅读(189)     博客类别:J2SE

    poi读取word模板并生成新的模板 案例1

    需求描述

     

    配置一个word模板,通过poi读取模板内容 并动态生成新的word文档

     

    效果如下

     

    word模板

     

    生成的效果

     

     

    案例源码

    依赖

    <dependency>
          <groupId>org.apache.poi</groupId>
          <artifactId>poi-ooxml</artifactId>
          <version>4.1.2</version>
        </dependency>
    
    <!-- word-->
        <dependency>
          <groupId>com.deepoove</groupId>
          <artifactId>poi-tl</artifactId>
          <version>1.10.0</version>
        </dependency>
    
    注意:如果poi-ooxml版本是5.x会与poi-tl产生冲突 如果没有用到poi-ooxml解析excel文档 可以不添加该依赖

    案例

    package com.et.com.et.test;
    
    import com.alibaba.fastjson.JSON;
    import com.deepoove.poi.XWPFTemplate;
    import com.deepoove.poi.config.Configure;
    import com.deepoove.poi.data.PictureRenderData;
    import com.deepoove.poi.data.PictureType;
    import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.util.Arrays;
    import java.util.Collections;
    import java.util.HashMap;
    import java.util.List;
    
    public class WordTest {
        public static void main(String[] args) {
            try {
                // 模板文件地址
                String filePath = "D:\\demo.docx";
                // 读取模板后保存生成word的地址
                String outPath = "D:\\wordTest.docx";
    
                // 为成绩2的显示绑定行循环,成绩1与3可以不要此行
                LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
                // 将score22设置为行循环绑定的数据源的key,即key是score22的value会在模板中的{{score22}}处进行解析,成绩1与3可以不要此行
                Configure configure = Configure.builder().bind("score22", policy).build();
    
                // 读取模板、数据并渲染
                XWPFTemplate template = XWPFTemplate.compile(new File(filePath), configure).render(
                        // 创建一个map并设置为只读map
                        Collections.unmodifiableMap(new HashMap<String, Object>() {
                            {
                                // 设置普通文本的值
                                put("username", "张三");
                                // 设置选择框
                                String sex = "🚹";
                                List<String> list = Arrays.asList("🚹", "🚺");
                                for (int index = 0; index < list.size(); index++) {
                                    if (list.get(index).equals(sex)) {
                                        put("checkBox" + index, "☑");
                                    } else {
                                        put("checkBox" + index, "□");
                                    }
                                }
                                // 设置照片的值
                                FileInputStream inputStream = new FileInputStream(new File("D:\\1.png"));
                                PictureRenderData pictureRenderData = new PictureRenderData(100, 150, PictureType.suggestFileType(".png"), inputStream);
                                put("picture", pictureRenderData);
                                inputStream.close();
    
                                // 其他业务获取到数据源
                                String score = "[{\"name\":\"Chinese\",\"score\":99},{\"name\":\"Math\",\"score\":98},{\"name\":\"English\",\"score\":97}]";
                                // 成绩1在表格里循环
                                List<Score> forms = JSON.parseArray(score, Score.class);
                                for (int i = 0; i < forms.size(); i++) {
                                    put("name" + i, forms.get(i).getName());
                                    put("score" + i, forms.get(i).getScore());
                                }
    
                                // 成绩2
                                put("score22", forms);
                                put("total", 110);
    
                                // 成绩3
                                put("score", forms);
    
                            }
                        })
                );
                // 文件是否已存在,则删除
                File file = new File(outPath);
                if (file.exists()){
                    //file.delete();
                }
                // 生成word保存在指定目录
                template.writeToFile(outPath);
                template.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }