当前位置: 首页 > article >正文

java根据Word模板实现动态填充导出

最近项目中需要导出Word,根据不同的信息导出不同的内容,包含文本、列表、图片等,本文使用poi-tl实现在次做以记录。

  • 添加依赖
<!-- word导出 -->
<dependency>
	<groupId>com.deepoove</groupId>
	<artifactId>poi-tl</artifactId>
	<version>1.7.3</version>
</dependency>
<!--  上面需要的依赖-->
<dependency>
	<groupId>org.apache.poi</groupId>
	<artifactId>poi-ooxml</artifactId>
	<version>4.1.2</version>
</dependency>
<dependency>
	<groupId>org.apache.poi</groupId>
	<artifactId>poi-ooxml-schemas</artifactId>
	<version>4.1.2</version>
</dependency>
<dependency>
	<groupId>org.apache.poi</groupId>
	<artifactId>poi</artifactId>
	<version>4.1.2</version>
</dependency>

如果项目功能简单只是使用Word导出功能,只添加poi-tl包就可以,我这里添加的包多是因为还有其他功能,相互之间有影响,升级的话又牵扯太多,所以你懂的~

  • 制作模板

文本标签:使用{{属性名}}做处理
图片

列表集合:列表中集合使用{{集合名}},列表属性用[属性名]处理
图片

图片列表:集合处理方式都一样{{集合名}},图片属性增加@[@属性名]
图片

  • 编写代码

数据构建

/**
 * 填充数据源
 * 其中data存放的key值与模板中的文本域值相对应
 */
public static Map<String, Object> newData() {
    Map<String, Object> data = new HashMap<String, Object>();
    //key要与模板中的别名一一对应
    data.put("custNo", "bb2");
    data.put("custCnName", "特特我");
    data.put("productCategory", "官方的");
    data.put("orgKey", "4433");
    data.put("riskLevel", "1001");
    List<Map<String,Object>> list = new ArrayList<>();
    Map<String,Object> job ;
    int num = 1;
    while (num<3){
        job = new HashMap<>();
        job.put("id",num);
        job.put("reviewStatusName","aaa");
        job.put("reviewAdvice","bbb");
        job.put("controlWay","ccc");
        job.put("reviewUser","ddd");
        job.put("reviewDate",LocalDateTime.now());
        job.put("fileName","zipfile.zip");
        list.add(job);
        num++;
     }
     data.put("approvals", list);
     List<Map<String,Object>> maps1 = new ArrayList<>();
     for (int i = 1; i <= 5; i++) {
         Map<String,Object> m = new HashMap<>();
         if(i%2==0){// 读取本地磁盘图片
             m.put("pho", new PictureRenderData(50, 50, "D:\\timg.jpg"));
         }else {// 读取本地磁盘图片
             m.put("pho", new PictureRenderData(30, 30, "D:\\bug2.png"));
         }
         m.put("date",LocalDateTime.now());
         m.put("text", "共" + 5 + "张图片,当前为第" + (i) + "张");
         maps1.add(m);
     }
     data.put("imgCollection", maps1);
     data.put("img", new PictureRenderData(100, 100, "D:\\需求1.png"));
     return data;
}

数据处理

public static void main(String[] args) {
     try {
         String filePath = "G:\\产品详情.docx";//模板路径
         Map<String,Object> pdfMap = newData();
         log.info("响应信息:{}",pdfMap);
         String custCnName = pdfMap.get("custCnName")+"";
         String stt = "download" + File.separator + "产品详情页.docx";
         log.info("--------------{}----{}--------" , File.separator + "产品详情页.docx",stt);
         InputStream inputStream = new FileInputStream(filePath);
         String fileName = custCnName + "-产品风险查询详情";
         HackLoopTableRenderPolicy policy = new HackLoopTableRenderPolicy();
         Configure config = Configure.newBuilder().bind("approvals", policy).bind("imgCollection",policy).build();
         XWPFTemplate template = XWPFTemplate.compile(inputStream, config).render(pdfMap);
         String url = "G:\\"+fileName + ".docx";
         File file = new File(url);
         file.createNewFile();
         template.write(new FileOutputStream(file));
         template.close();
     } catch (Exception e) {
         log.error("导出异常:{}",e);
     }
}
  • 导出样例
    ☆ 文本
    图片

    ☆ 列表
    图片

    ☆ 图片
    图片
    参考:文章 FC464782123


http://www.kler.cn/a/456518.html

相关文章:

  • VuePress搭建个人博客
  • 1 数据库(下):多表设计 、多表查询 + SQL中的with查询语法(MySQL8.0以后版本才支持这种新语法)+ 数据库优化(索引优化)
  • Python 中的 with open:文件操作的最佳实践
  • 联邦协作训练大模型的一些研究进展
  • 【C++】BC89 包含数字9的数
  • 玉米中的元基因调控网络突出了功能上相关的调控相互作用。\zm.rn20b样本为例
  • 【阅读记录-章节7】Build a Large Language Model (From Scratch)
  • 基于submitit实现Python函数的集群计算
  • 【计组】例题课后题
  • AduSkin、WPF-UI、Prism:WPF 框架全解析与应用指南
  • 使用 OpenCV 绘制线条和矩形
  • 导师让你给实验室搭服务器?不会?我教你
  • jangow-01-1.0.1
  • Java 中 Stream 流的使用详解
  • Linux下shell基本命令之vi用法及示例
  • AI for Science
  • 如何在鸿蒙本地模拟器中使用HDC工具
  • JAVA学习笔记第二阶段开始 Day11 五种机制---机制1:泛型机制
  • Java和Go语言的优劣势对比
  • DVWA靶场搭建及错误解决教程
  • SQL 基础教程
  • 音视频学习(二十八):websocket-flv
  • 攻防世界web第二题unseping
  • leetcode刷题——动态规划(2)
  • Vue使用Tinymce 编辑器
  • 《机器学习》数据预处理简介