读word模板批量生成制式文件

news/2024/11/26 2:01:59/

文章目录

  • 1、Maven依赖
  • 2、.docx或.doc格式的word模板准备
  • 3、读word模板,批量替换代码域,生成文件,demo
  • 4、结果展示

1、Maven依赖

  <dependency><groupId>fr.opensagres.xdocreport</groupId><artifactId>fr.opensagres.xdocreport.core</artifactId><version>2.0.2</version></dependency><dependency><groupId>fr.opensagres.xdocreport</groupId><artifactId>fr.opensagres.xdocreport.document</artifactId><version>2.0.2</version></dependency><dependency><groupId>fr.opensagres.xdocreport</groupId><artifactId>fr.opensagres.xdocreport.template</artifactId><version>2.0.2</version></dependency><dependency><groupId>fr.opensagres.xdocreport</groupId><artifactId>fr.opensagres.xdocreport.document.docx</artifactId><version>2.0.2</version></dependency><dependency><groupId>fr.opensagres.xdocreport</groupId><artifactId>fr.opensagres.xdocreport.template.freemarker</artifactId><version>2.0.2</version></dependency>

2、.docx或.doc格式的word模板准备

  1. 创建.docx文件,编写内容

image.png

  1. 添加编辑域

按Ctrl+F9,创建编辑域
image.png
右击,选择编辑域
image.png
选择邮件合并,修改域代码要注意域代码的格式为:MERGEFIELD ${name}name为需要填充的内容。
image.png
        依次类推,填上所有的编辑域,调整文档格式等,就完成了word文档准备。
        之后需要代码读word模板转数据流,进行代码域的变量批量替换,重新写文件就完成的word文件生成工作。

3、读word模板,批量替换代码域,生成文件,demo

package com.dongzi.utils.word;import fr.opensagres.xdocreport.core.XDocReportException;
import fr.opensagres.xdocreport.document.IXDocReport;
import fr.opensagres.xdocreport.document.registry.XDocReportRegistry;
import fr.opensagres.xdocreport.template.IContext;
import fr.opensagres.xdocreport.template.TemplateEngineKind;import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;/*** 读word模板,生成数据*/
public class ReadWordTemplate {public static void main(String[] args) throws IOException, XDocReportException {// 从resources/template中获取word模板数据IXDocReport ixDocReport = readWord("info.docx");IContext context = ixDocReport.createContext();// set value// putTemplateValue_1(context);// putTemplateValue_2(context);putTemplateValue_3(context);// =============FileOutputStream out = new FileOutputStream("D:/temp/docx模板输出.docx");ixDocReport.process(context, out);out.flush();out.close();}public static IXDocReport readWord(String fileName) throws IOException, XDocReportException {// 读模板的方式// 方式1:通过URL加载
//        URL url = ClassLoader.getSystemClassLoader().getResource("template/" + fileName);
//        assert url != null;
//        InputStream in_1 = url.openStream();// 方式2:系统资源转数据流InputStream in_2 = ClassLoader.getSystemResourceAsStream("template/" + fileName);// 方式3:spring的类加载器,获取资源
//        ClassPathResource pathResource = new ClassPathResource("template/" + fileName);
//        InputStream in_3 = pathResource.getInputStream();return XDocReportRegistry.getRegistry().loadReport(in_2, TemplateEngineKind.Freemarker);}// 设置docx模板值public static void putTemplateValue_1(IContext context) {// docx文档模板读取,必须要预先再模板里面设置文本域,Ctrl+F9/*1. Ctrl+F9,打开编辑域2. 域选择“邮件合并”,域代码为:MERGEFIELD ${yourAddress}3. 页面展示的格式为:«${yourAddress}»,模板可替换*/context.put("yourName", "孙悟空");context.put("yourAge", "500");context.put("yourAddress", "花果山水帘洞");}public static void putTemplateValue_2(IContext context) {// 生成数据Map<String, Object> mapValues = new HashMap<>();mapValues.put("yourName", "齐天大圣");mapValues.put("yourAge", 36000);mapValues.put("yourAddress", "花果山水帘洞");//context.putMap(mapValues);}public static void putTemplateValue_3(IContext context) {// 生成数据Map<String, Object> mapValues = new HashMap<>();mapValues.put("yourName", "派大星");mapValues.put("yourAge", 36000);mapValues.put("yourAddress", "黄土高坡");for (int i = 1; i <= 10; i++) {mapValues.put("index_" + i, i);mapValues.put("value_" + i, i + 2);}//context.putMap(mapValues);}}

4、结果展示

image.png
至此,整个模板读取生成过程全部结束。


http://www.ppmy.cn/news/1075234.html

相关文章

详解 SpringMVC 中获取请求参数

文章目录 1、通过ServletAPI获取2、通过控制器方法的形参获取请求参数3、[RequestParam ](/RequestParam )4、[RequestHeader ](/RequestHeader )5、[CookieValue ](/CookieValue )6、通过POJO获取请求参数7、解决获取请求参数的乱码问题总结 在Spring MVC中&#xff0c;获取请…

centos安装jdk-8u371-linux-x64.tar.gz包

java -version //查看jdk版本 rpm -qa | grep jdk 删除带有"openjdk"字样的jdk 例: rpm -e --nodeps java-1.7.0-openjdk-1.7.0.141-2.6.10.5.el7.x86_64 下载该版本的jdk(jdk-8u371-linux-x64.tar.gz) (https://www.oracle.com/java/technologies/javase/javase8u2…

Kafka系列三基础概念

文章首发于个人博客&#xff0c;欢迎访问关注&#xff1a;https://www.lin2j.tech Kafka 是一款分布式消息发布和订阅系统&#xff0c;其高性能、高吞吐量的特点决定了其适用于大数据传输场景。 基础概念 Broker Broker 其实就是一个运行 Kafka 服务的服务器。Kafka 集群包…

【数据库技术】NineData数据复制,加速实时数仓构建

8 月 30 日&#xff0c;由 NineData 和 SelectDB 共同举办的主题为“实时数据驱动&#xff0c;引领企业智能化数据管理”的线上联合发布会&#xff0c;圆满成功举办&#xff01;双方聚焦于实时数据仓库技术和数据开发能力&#xff0c;展示如何通过强大的生态开发兼容性&#xf…

PowerBuilder通过jdbc连接mysql

PowerBuilder,一个古老的IDE,打算陆续发些相关的,也许还有人需要,内容可能涉及其他作者,但基本都是基于本人实践整理,如涉及归属,请联系. 打开PB,菜单Tools--> system options,打开JAVA选项,点击新增文件&#xff08;白色文件图标&#xff09; 重要&#xff1a;需要在这里修…

【问题处理】解决Spring事务@Transactional多层嵌套失效

场景&#xff1a; 在 AService 中&#xff0c;我会直接调用 A 的数据操作层去操作 A的数据 以及 A关联密切的其它数据&#xff0c;在操作完之后&#xff0c;会去调用 BService 和 CService 中更新对应的数据&#xff0c;并在每个方法上使用了事务&#xff0c;但在调用 BService…

核心交换机的六个基础知识

中午好&#xff0c;我的网工朋友 今天来聊聊核心交换机啊。 首先你要明确一个概念&#xff0c;接入层交换机、汇聚层交换机、核心层交换机并非是交换机的种类或者属性&#xff0c;只是由其所执行的任务来划分的。 从网络拓扑结构来讲&#xff0c;一个计算机网络系统结构需采用…

TCP之三次握手四次挥手

在前面的文章中我们了解到http是基于TCP/IP协议的&#xff0c;这篇文章我们来了解一下TCP/IP。 一、TCP与UDP 1、UDP 基于非连接。类似于写信&#xff0c;不能保证对方能不能接收到&#xff0c;接收到的内容是否完整&#xff0c;顺序是否正确。 优缺点&#xff1a;性能损耗小…