读word模板批量生成制式文件
文章目录
- 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模板准备
- 创建.docx文件,编写内容

- 添加编辑域
按Ctrl+F9,创建编辑域

右击,选择编辑域

选择邮件合并,修改域代码要注意域代码的格式为:MERGEFIELD ${name}name为需要填充的内容。

依次类推,填上所有的编辑域,调整文档格式等,就完成了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、结果展示

至此,整个模板读取生成过程全部结束。
相关文章:
读word模板批量生成制式文件
文章目录 1、Maven依赖2、.docx或.doc格式的word模板准备3、读word模板,批量替换代码域,生成文件,demo4、结果展示 1、Maven依赖 <dependency><groupId>fr.opensagres.xdocreport</groupId><artifactId>fr.opensagre…...
Node.js crypto模块 加密算法
背景 微信小程序调用飞蛾热敏纸打印机,需要进行参数sig签名校验,使用的是sha1进行加密 // 通过crypto.createHash()函数,创建一个hash实例,但是需要调用md5,sha1,sha256,sha512算法来实现实例的…...
Win11 避坑安装WSL2 Ubuntu22.04
开始之前以管理员身份打开 PowerShell 启用适用于 Linux 的 Windows 子系统 需要先启用“适用于 Linux 的 Windows 子系统”可选功能,然后才能在 Windows 上安装 Linux 分发。 PowerShell然后输入以下命令: dism.exe /online /enable-feature /featur…...
ESP8266+继电器+MQTT+VUE 实现远程开关灯
超详细教程 – ESP8266继电器MQTTVUE 实现远程开关灯 超详细教程 – ESP8266继电器MQTTVUE 实现远程开关灯 接线图 NC(通常闭合)与COM(公共)、NO(通常开放)与COM 是继电器引脚的不同配置,用于不…...
Android中级——四大组件工作过程
四大组件工作过程 ActivityServicestartService()过程bindService()过程 BroadcastReceiver注册过程发送和接收过程 ContentProvider Activity startActivity()最终都会调用到startActivityForResult() public void startActivityForResult(RequiresPermission Intent intent…...
【RabbitMQ】RabbitMQ 服务无法启动。系统出错。发生系统错误 1067。进程意外终止。
问题描述 RabbitMQ 服务无法启动。 rabbitmq-service.bat startRabbitMQ 服务正在启动 . RabbitMQ 服务无法启动。系统出错。发生系统错误 1067。进程意外终止。原因分析 RabbitMQ和Erlang版本不匹配。 解决方案 查询并安装RabbitMQ版本对应Erlang版本 https://www.rabbitm…...
如何理解attention中的Q、K、V?
y直接用torch实现一个SelfAttention来说一说: 1、首先定义三哥线性变换,query,key以及value: class BertSelfAttention(nn.Module):self.query nn.Linear(config.hidden_size, self.all_head_size)#输入768,输出768…...
Redis----取代RabbitMq 和 Kafka的解决方案
背景 已知rabbitmq和kafka作为消息中间件来给程序之间增加异步消息传递功能,这两个中间件都是专业的,功能也很强,但是有的时候过于复杂,对于只有一组消费者的消息队列,使用Redis 就可以轻松搞定。 异步消息队列 读者…...
动态规划之连续乘积最大子数组 连续和最大子数组
一. 连续和最大子数组 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组 是数组中的一个连续部分。 示例 1: 输入:nums [-2,1,-3,4,-1,2,1,-5,…...
keil在点击debug无法运行(全速运行)
1、今天发现我之前可以debug的程序,在板子上无法debug了,打断点完全没用 2、换了电脑,带板子过去也这样,之前可以运行的代码都debug不了 3、按照网上的方法,都不行,全速运行,单步执行都是灰色…...
go语言-协程
mOS结构体 每一种操作系统不同的线程信息 g给g0栈给g0协程内存中分配的地址,记录函数跳转信息, 单线程循环 0.x版本 1.0版本 多线程循环 操作系统并不知道Goroutine的存在 操作系统线程执行一个调度循环,顺序执行Goroutine 调度循环非常…...
如何伪造http头,让后端认为是本地访问
0x00 前言 这个知识点纯粹就是为了ctf准备的,很少有系统会出现这种情况。 0x01 正文 1.host头 如果后端从host取值来判断是否是本地就可以通过此方法进行绕过: host: 127.0.0.12.X-Forwarded-For X-Forwarded-For(XFF)是用来…...
视频剪辑音效处理软件有哪些?视频剪辑软件那个好用
音效是视频剪辑的重要部分,能起到画龙点睛的作用。在短视频平台中,一段出彩的音效能将原本平平无奇的视频变得生动有趣。那么,视频剪辑音效处理软件有哪些?本文会给大家介绍好用的音效处理软件,同时也会介绍视频剪辑音…...
搭建STM32F407的Freertos系统(基于STM32CubeMX)
本人长期开发Linux、Windows上应用软件,一直以来MCU开发有所接触,但较少(最近项目需要,小公司么,都得会,被逼的),好在有STM32CubeMX这样工具,貌似就是我想要的工具。 本次…...
vite 配置自动补全文件的后缀名
vite 不建议自动补全,文件的后缀名的 const Home ()>import("/views/Home.vue");文件是必须要加上 .vue 的后缀名的 如果 想要像 webpack 一样的不用写, 可以在vite.config.js中配置如下就可以了...
基于Spring Boot的人才公寓管理系统设计与实现(Java+spring boot+MySQL)
获取源码或者论文请私信博主 演示视频: 基于Spring Boot的人才公寓管理系统设计与实现(Javaspring bootMySQL) 使用技术: 前端:html css javascript jQuery ajax thymeleaf 微信小程序 后端:Java spring…...
Python 编写函数
文章目录 条件语句循环语句自定义函数函数参数的传递类型函数的参数传入方法 lambda, map, filter, reduce 函数try-except 语句调试一些常用的内置函数 条件语句 编写程序时,经常用到一些条件或判断,需要用到 if 语句,它的字面意思是&#…...
C# Solidworks二次开发:创建距离配合以及移动组件API详解
今天要讲的文章是关于如何创建距离配合和移动组件的API详解。 (1)创建配合API,CreateMate() 这个API的解释是根据指定的特性数据对象来创建配合,也就可以理解为输入什么样的特征对象就可以创建出什么配合,这个API的输…...
Excel:通过Lookup函数提取指定文本关键词
函数公式:LOOKUP(9^9,FIND($G 2 : 2: 2:G 6 , C 2 ) , 6,C2), 6,C2),G 2 : 2: 2:G$6) 公式解释: lookup第一参数为9^9:代表的是一个极大值的数据,查询位置里面最接近这一个值的数据;lookup第二参数用find函数代替&am…...
sql:SQL优化知识点记录(六)
(1)索引优化1 查看一下有没有建立索引: 用到索引中的一个:type中的ref决定访问性能 用到索引中的两个:通过key_len的长度可以看出来,比第一个大一点。或者通过ref:中用到了两个常量const 用到了…...
Python实战:M3FD红外数据集高效转YOLO格式的完整指南
1. 为什么需要转换M3FD数据集格式 红外目标检测在夜间安防、自动驾驶等领域越来越重要,而M3FD作为优质的红外数据集却采用了VOC格式标注。这就像你买了台进口电器,却发现插头不匹配国内插座——虽然东西是好东西,但直接使用会遇到麻烦。 YO…...
贝叶斯分位数回归实战指南:从理论到业务落地
贝叶斯分位数回归实战指南:从理论到业务落地 【免费下载链接】pymc Python 中的贝叶斯建模和概率编程。 项目地址: https://gitcode.com/GitHub_Trending/py/pymc 在数据科学实践中,我们常面临这样的困境:当预测用户行为、设备故障时间…...
Xilinx ZYNQ/MPSOC开发者必看:如何为你的PetaLinux 2022.1工程搭建一个高效的本地缓存服务器(sstate downloads)
Xilinx ZYNQ/MPSOC团队开发实战:构建企业级PetaLinux缓存服务器集群 当五个工程师同时对着公司服务器发起全量编译时,机房里传出的风扇轰鸣声总让我想起波音747起飞——这是我们去年某个ZYNQ UltraScale项目的日常。直到我们在本地部署了分布式sstate缓存…...
Display Driver Uninstaller深度指南:解决显卡驱动残留问题的系统级清理方案
Display Driver Uninstaller深度指南:解决显卡驱动残留问题的系统级清理方案 【免费下载链接】display-drivers-uninstaller Display Driver Uninstaller (DDU) a driver removal utility / cleaner utility 项目地址: https://gitcode.com/gh_mirrors/di/display…...
MarkItDown:文档转换工具的全方位解析与高效应用指南
MarkItDown:文档转换工具的全方位解析与高效应用指南 【免费下载链接】markitdown 将文件和办公文档转换为 Markdown 的 Python 工具 项目地址: https://gitcode.com/GitHub_Trending/ma/markitdown 在数字化办公与内容创作领域,文档格式转换是连…...
告别‘OSError‘:手把手教你为transformers库设置离线/代理模式,稳定加载预训练模型
构建稳定高效的Hugging Face模型加载环境:从原理到实践 当你在深夜赶项目进度时,突然遇到那个令人窒息的红色报错——"OSError: Couldnt connect to https://huggingface.co",这感觉就像在马拉松终点线前被绊倒。作为现代NLP开发的…...
5分钟搞定!Cesium/Leaflet/OpenLayers调用免费瓦片地图资源全攻略
三大地图框架快速调用免费瓦片资源实战指南 第一次接触GIS开发时,最让人头疼的莫过于地图底图资源的获取。作为项目的基础支撑,地图瓦片的质量和稳定性直接影响最终用户体验。但商业地图API往往价格不菲,对个人开发者和小型项目来说成本压力较…...
洛谷-入门4-数组4
P5732 【深基5.习7】杨辉三角题目描述给出 n(1≤n≤20),输出杨辉三角的前 n 行。如果你不知道什么是杨辉三角,可以观察样例找找规律。输入格式无输出格式无输入输出样例输入 #1复制6输出 #1复制1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1实现代码&…...
告别黑屏!手把手教你为NT35510屏幕适配TouchGFX显示驱动(基于STM32CubeIDE)
深度解析NT35510屏幕与TouchGFX的驱动适配实战 在嵌入式GUI开发领域,TouchGFX凭借其流畅的动画效果和高效的渲染引擎,已成为STM32平台上的首选框架之一。然而,当开发者尝试在非官方支持的屏幕上使用TouchGFX时,底层显示驱动的适配…...
LeaguePrank:英雄联盟客户端个性化定制工具深度探索
LeaguePrank:英雄联盟客户端个性化定制工具深度探索 【免费下载链接】LeaguePrank 项目地址: https://gitcode.com/gh_mirrors/le/LeaguePrank 在MOBA游戏蓬勃发展的今天,玩家对游戏体验的个性化需求日益增长。LeaguePrank作为一款基于官方LCU A…...
