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

【导出Word】如何使用Java+Freemarker模板引擎,根据XML模板文件生成Word文档(只含文本内容的模板)

这篇文章,主要介绍如何使用Java+Freemarker模板引擎,根据XML模板文件生成Word文档。

目录

一、导出Word文档

1.1、基础知识

1.2、制作模板文件

1.3、代码实现

(1)引入依赖

(2)创建Freemarker工具类

(3)测试案例代码

(4)运行效果


一、导出Word文档

1.1、基础知识

Word文件有两种后缀格式,分别是:doc和docx,doc是Word2003之前使用的,docx是Word2007之后使用的,可以说docx是对doc的扩展和优化。docx的响应速度、性能、占用空间都比doc更好,另外docx本质上是一个zip格式的压缩文件,底层是基于OOXML组织数据的,也就是说,docx底层其实就是使用XML组成的一系列文件,然后使用程序渲染XML文件,最终就是我们看到的Word文件样式啦。

我这篇文章中使用的Word模板文件就是利用docx后缀的,核心思想是将docx文件转换成对应的XML文件,然后修改XML文件中的内容,将其改成Freemarker模板引擎中的占位符,之后通过Freemarker渲染程序将占位符替换成实际的数据,并且将替换之后的模板文件转换成docx文档,这样就实现了根据模板文件生成Word文档啦。

  • 注意:freemarker中的占位符是${},例如:这里使用的是【${name}】的形式,那么传递的数据中就需要有一个叫做【name】的字段。

1.2、制作模板文件

首先创建一个docx后缀的Word文件,文件中的内容你自己根据实际需求编写就可以啦,我创建的docx文件内容如下所示:

内容编辑完成之后,将其另存为XML文件,如下图所示:

导出XML文件之后,打开这个文件,此时你会看到里面都是XML标签,首先格式化一下,这样看起来会舒服些,可以检查一下你的占位符内容是否满足freemarker语法。因为有些时候,我们导出的XML文件中,可能会将【${xxx}】分隔成两行,从而导致占位符失效,所以有时候需要手动修改一下占位符。导出的Word XML文件内容大致如下所示:

替换完成之后,我们的Word模板文件就做好啦,这个XML文件就是我们最终需要的Word模板文件,后面需要使用到。

1.3、代码实现

(1)引入依赖

如果是SpringBoot的工程,SpringBoot已经给我们提供了freemarker的启动器,这使得我们可以快速的集成freemarker,如下:

<!-- 引入 freemarker 依赖 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>

如果是普通的Java工程,可以引入下面的依赖:

<!-- https://mvnrepository.com/artifact/org.freemarker/freemarker -->
<dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.30</version>
</dependency>

(2)创建Freemarker工具类

引入freemarker依赖之后,就可以使用Freemarker编写一个工具类,专门用于处理文件的导出和数据渲染。


package com.gitcode.demo.util;import freemarker.template.Configuration;
import freemarker.template.Template;import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.nio.charset.StandardCharsets;
import java.util.Map;/*** @version 1.0.0* @Date: 2023/8/4 15:05* @Author ZhuYouBin* @Description: Freemarker 工具类*/
public class FreemarkerUtil {/*** 使用 Freemarker 生成 Word 文件* @param templateName 模板文件路径名称* @param fileName 生成的文件路径以及名称* @param dataModel 填充的数据对象*/public static void exportWord(String templateName, String fileName, Map<String, Object> dataModel) {generateFile(templateName, fileName, dataModel);}/*** 使用 Freemarker 生成指定文件* @param templateName 模板文件路径名称* @param fileName 生成的文件路径以及名称* @param dataModel 填充的数据对象*/private static void generateFile(String templateName, String fileName, Map<String, Object> dataModel) {try {// 1、创建配置对象Configuration config = new Configuration(Configuration.VERSION_2_3_30);config.setDefaultEncoding("utf-8");config.setClassForTemplateLoading(FreemarkerUtil.class, "/templates");// 2、获取模板文件Template template = config.getTemplate(templateName);// 3、创建生成的文件对象File file = new File(fileName);FileOutputStream fos = new FileOutputStream(file);BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(fos, StandardCharsets.UTF_8));// 4、渲染模板文件template.process(dataModel, writer);// 5、关闭流writer.close();} catch (Exception e) {e.printStackTrace();}}}

(3)测试案例代码

package com.gitcode.demo.word;import com.gitcode.demo.util.FreemarkerUtil;import java.util.HashMap;
import java.util.Map;/*** @version 1.0.0* @Date: 2023/8/4 15:26* @Author ZhuYouBin* @Description: 使用 Freemarker 导出 Word 文件*/
public class ExportWordDemo {public static void main(String[] args) {String templateName = "freemarker模板文件.xml";String fileName = "导出的word文档.docx";Map<String, Object> dataModel = new HashMap<>();dataModel.put("name", "张三");dataModel.put("sex", "男");dataModel.put("age", "20");dataModel.put("address", "xxx地址yyy号");// 执行导出FreemarkerUtil.exportWord(templateName, fileName, dataModel);}
}

(4)运行效果

运行测试案例的代码,然后在工程目录下,就可以看到生成的Word文档,内容如下所示:

上面的模板文件只是简单的文本,你也可以添加表格、图片等内容到模板文件里面,可以使用Freemarker中的循环标签实现表格数据的自动添加,图片内容是采用base64编码,所以需要读取图片将其转换成base64编码之后,再渲染到XML文件中,后面的文章在介绍表格和图片的模板导出。

到此,Freemarker导出Word文档就介绍完啦。

综上,这篇文章结束了,主要介绍如何使用Java+Freemarker模板引擎,根据XML模板文件生成Word文档。

相关文章:

【导出Word】如何使用Java+Freemarker模板引擎,根据XML模板文件生成Word文档(只含文本内容的模板)

这篇文章&#xff0c;主要介绍如何使用JavaFreemarker模板引擎&#xff0c;根据XML模板文件生成Word文档。 目录 一、导出Word文档 1.1、基础知识 1.2、制作模板文件 1.3、代码实现 &#xff08;1&#xff09;引入依赖 &#xff08;2&#xff09;创建Freemarker工具类 &…...

Devart dbForge Studio for MySQL Crack

Devart dbForge Studio for MySQL Crack dbForge Studio for MySQL是一个用于MySQL和MariaDB数据库开发、管理和管理的通用GUI工具。IDE允许您通过直观的界面创建和执行查询、开发和调试存储例程、自动化数据库对象管理、分析表数据。MySQL客户端提供了数据和模式比较和同步工具…...

C++、Java、JavaScript和python几个语句的对比介绍

C、Java、JavaScript和python几个语句的对比介绍 C、Java、JavaScript和python语言的for语句 C、Java和JavaScript的for语句的语法类似如下&#xff1a; for (初始条件; 循环条件; 循环后操作) { // 循环体代码 } 初始条件是在进入循环之前执行的语句&#xff0c;初始化循环…...

第20节 R语言医学分析:某保险医疗事故赔偿因素分析

文章目录 某保险医疗事故赔偿因素分析源码源文件下载某保险医疗事故赔偿因素分析 我们分析数据集“诉讼”的第一个方法是确定样本数量、变量类型、缩放/编码约定(如果有)用于验证数据清理。 接下来,数据集看起来很干净,没有缺失值,并且对于分类变量,将编码约定替换为实际…...

【雕爷学编程】MicroPython动手做(28)——物联网之Yeelight 4

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…...

解决K8S集群设置污点后,污点不生效,下发应用的问题

问题&#xff1a;在集群中部署了三个daemonset&#xff0c;一开始加了容忍Toleration&#xff0c;后边去掉Toleration后&#xff0c;还是一直往边缘节点上部署应用&#xff0c;非常离谱 解决&#xff1a;删掉Toleration后&#xff0c;需要把annotations一起删掉&#xff0c;因为…...

使用$test$plusargs提高RTL验收速度

文章目录 0 前言1 语法介绍2 示例3 多种情况的testbench怎么写 0 前言 这段时间在整合一个小ip&#xff0c;因为要验证每个feature是否可行&#xff0c;需要用testbench C语言的方式进行仿真验证&#xff0c;由于每种feature不仅要在C语言中修改寄存器配置&#xff0c;还要再…...

MySQL~mysql基础应用相关题

整卷阅览&#xff1a; 想要获取试卷原版请点击以下链接下载&#xff1a; https://download.csdn.net/download/qq_53142796/88168133https://download.csdn.net/download/qq_53142796/88168133 解题过程&#xff1a; 数据库&#xff1a;studentdb 数据库表如下&#xff1a; …...

Redis | 哨兵模式

Redis | 哨兵模式 1. 简介 Redis Sentinel&#xff08;哨兵&#xff09;是Redis提供的一种高可用性解决方案。它是一个独立的进程&#xff0c;用于监控和管理Redis主从模式的节点&#xff0c;并在主节点故障时自动进行故障转移。哨兵模式可以确保Redis集群的高可用性和数据一…...

MySQL语句性能分析与优化

目录 SQL性能分析 SQL执行频率 SQL慢查询日志 Profile Explain SQL优化 插入数据的优化 主键优化 Order By优化 Group By优化 Limit 优化 Count 优化 Update 优化 多表连接查询优化 SQL性能分析 通过SQL性能分析来做SQL的优化&#xff0c;主要是优化SQL的查询语…...

SpringBoot实现数据库读写分离

SpringBoot实现数据库读写分离 参考博客https://blog.csdn.net/qq_31708899/article/details/121577253 实现原理&#xff1a;翻看AbstractRoutingDataSource源码我们可以看到其中的targetDataSource可以维护一组目标数据源(采用map数据结构)&#xff0c;并且做了路由key与目标…...

Linux(四)--包软件管理器与Linux上环境部署示例

一.包软件管理器【yum和apt】 1.先来学习使用yum命令。yum&#xff1a;RPM包软件管理器&#xff0c;用于自动化安装配置Linux软件&#xff0c;并可以自动解决依赖问题。通过yum命令我们可以轻松实现软件的下载&#xff0c;查找&#xff0c;卸载与更新等管理软件的操作。 最常用…...

自监督去噪:Recorrupted-to-Recorrupted原理分析与总结

文章目录 1. 方法原理1.1 相关研究1.2 研究思路1.3 小结 2. 实验结果3. 总结 文章地址: https://ieeexplore.ieee.org/document/9577798/footnotes#footnotes 参考博客: https://github.com/PangTongyao/Recorrupted-to-Recorrupted-Unsupervised-Deep-Learning-for-Image-Den…...

【css】css实现水平和垂直居中

通过 justify-content 和 align-items设置水平和垂直居中&#xff0c; justify-content 设置水平方向&#xff0c;align-items设置垂直方向。 代码&#xff1a; <style> .center {display: flex;justify-content: center;align-items: center;height: 200px;border: 3px…...

常见Charles在Windows10抓包乱码问题

废话不多说 直接开整 最近反复安装证书还是乱码 网上各种百度还是不行 首先计算机查看安装好的证书 certmgr.msc 找到并删除掉 重新安装证书 具体解决方法&#xff1a; 第一步&#xff1a;点击 【工具栏–>Proxy–>SSL Proxying Settings…】 第二步&#xff1a;配置…...

汽车维修保养记录查询API:实现车辆健康状况一手掌握

在当今的数字化世界中&#xff0c;汽车维修保养记录的查询和管理变得前所未有地简单和便捷。通过API&#xff0c;我们可以轻松地获取车辆的维修和保养记录&#xff0c;从而实现对手中车辆健康状况的实时掌握。 API&#xff08;应用程序接口&#xff09;是进行数据交换和通信的标…...

正则表达式学习记录(Python)

正则表达式学习记录&#xff08;Python&#xff09; 一、特殊符号和字符 多个正则表达式匹配 &#xff08; | ) 用来分隔不同的匹配模式&#xff0c;相当于逻辑或&#xff0c;可以符合其中任何一个正则表达式 at | home # 表示匹配at或者home bat | bet | bit # 表示匹配bat或…...

Ubuntu20.04操作系统安装Docker

1、添加Docker仓库 curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -sudo add-apt-repository \"deb [archamd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/ \$(lsb_release -cs) \stable"2、安装Docker sudo…...

python制作小程序制作流程,用python编写一个小程序

这篇文章主要介绍了python制作小程序代码宠物运输&#xff0c;具有一定借鉴价值&#xff0c;需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获&#xff0c;下面让小编带着大家一起了解一下。 1 importtkinter2 importtkinter.messagebox3 importmath4 classJSQ:5 6 7 d…...

Github 创建自己的博客网站

参考pku大佬视频制作&#xff0c;附上B站视频&#xff1a;【GitHub Pages 个人网站构建与发布】 同时还参考了&#xff1a;【Python版宝藏级静态站点生成器Material for MkDocs】 GitHub Pages 介绍 内容参考&#xff1a;GitHub Pages - 杨希杰的个人网站 (yang-xijie.githu…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索&#xff08;基于物理空间 广播范围&#xff09;2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

dify打造数据可视化图表

一、概述 在日常工作和学习中&#xff0c;我们经常需要和数据打交道。无论是分析报告、项目展示&#xff0c;还是简单的数据洞察&#xff0c;一个清晰直观的图表&#xff0c;往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server&#xff0c;由蚂蚁集团 AntV 团队…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中&#xff0c;理解API&#xff08;应用程序接口&#xff09;和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能&#xff0c;使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...