java利用freemarker动态生成word文档及动态表格
这里写自定义目录标题
- 目标
- 准备
- 实现
- 处理模板
- java实现
- 验证
目标
根据给定word模板,动态填充指定内容,并输出为新的word文档。
准备
1.模板:
准备一份目标格式的word文档,如:word模板.docx
2.pom:
引用freemarker,可以直接引用,也可以引用starter
实现
处理模板
调整好格式的word模板 word模板.docx ,需要另存为 .xml 文件(打开后的xml文件内容可能有点乱,可以格式化后进行操作:在线格式化),然后将需要填充的地方设置参数,最终将 .xml 文件后缀手动改为 .ftl ,模板才算处理完整。
1.将.docx 文件另存为 .xml 文件
2.将 .xml 文件格式化:在线格式化:https://c.runoob.com/front-end/710/
3.预设参数
找到需要填充或替换的地方,以${param}的形式进行参数预设。
注意: ${} 中的参数非常重要,必须和后面java代码中 传入 的参数名称 保持一致 !且出现在模板中的预设参数,在java生成文件时,不可传null!!
如:
动态表格:需要选定动态生成的范围,添加list标签
通过word模板中需要填充的表格示例“内容4”,找到这一行的标签</w:tr>
再找到<w:tr>起始标签,添加<#list values as item>,其中 values 是后面 java 代码中生成文件时,传入的参数名。
再回到</w:tr>,添加</#list>闭合标签
4.更改后缀名:
全部参数预设完成后,保存文件,并将文件后缀改为 .ftl
java实现
<!--生成word--><!-- freemarker jar -->
<!-- <dependency>-->
<!-- <groupId>org.freemarker</groupId>-->
<!-- <artifactId>freemarker</artifactId>-->
<!-- <version>2.3.28</version>-->
<!-- </dependency>--><!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-freemarker --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-freemarker</artifactId><version>3.0.0</version></dependency><!-- https://mvnrepository.com/artifact/e-iceblue/spire.doc.free --><!--为了后续解决用WPS创建的文档部分手机不能兼容,出现很多格式的问题,使用office手机可以很好的兼容--><dependency><groupId>e-iceblue</groupId><artifactId>spire.doc.free</artifactId><version>5.2.0</version></dependency>
package com.example.demo.word2pdf;import com.spire.doc.Document;
import com.spire.doc.FileFormat;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import lombok.AllArgsConstructor;
import lombok.Data;import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** @author* @date* @apiNote 生成动态文档帮助类*/
@Data
public class WordUtil {/*** 失败错误码*/public static String FILE_CREATE_FAIL = "FAIL";private Configuration configuration = null;/** 模板文件存放的目录*/private String baseDir;/** 模板文件名称*/private String templateFile;/** word生成的输出目录*/private String outputDir;public WordUtil() {configuration = new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS);configuration.setDefaultEncoding("UTF-8");}/** 转换成word*/public String createWord(Map<String, Object> dataMap) {configuration.setClassForTemplateLoading(this.getClass(), "");Template t = null;try {//得到模板文件configuration.setDirectoryForTemplateLoading(new File(baseDir));t = configuration.getTemplate(templateFile);} catch (IOException e) {e.printStackTrace();}// GwUtil.getFileNo(""); 调用生成随机数的方法
// File outFile = new File(outputDir + GwUtil.getFileNo("") + ".docx"); //导出文件File outFile = new File(outputDir + "\\" + Math.random() + ".docx"); //导出文件Writer out = null;try {out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile)));} catch (FileNotFoundException e1) {e1.printStackTrace();}try {t.process(dataMap, out); //将填充数据填入模板文件并输出到目标文件return outFile.getPath();} catch (TemplateException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return this.FILE_CREATE_FAIL;}public static void main(String[] args) throws Exception {// 调用word文档帮助类WordUtil wordUtil = new WordUtil();// 模板文件存放的目录wordUtil.setBaseDir("E:\\test2");// 模板文件名称wordUtil.setTemplateFile("word模板.ftl");// word生成的输出目录wordUtil.setOutputDir("E:\\test2");// 初始化数据mapMap<String, Object> dataMap = new HashMap<>();// word预设参数dataMap.put("value1", "中文werwer");dataMap.put("value2", "您暗室逢灯dasdfas");dataMap.put("value3", "wret地方发放到");dataMap.put("value4", "公司hello world法规");// 动态表格数据List<Value> values = new ArrayList<>();values.add(new Value("内容1-1", "内容2-1", "内容3-1", "内容4-1"));values.add(new Value("内容1-2", "内容2-2", "内容3-2", "内容4-2"));values.add(new Value("内容1-3", "内容2-3", "内容3-3", "内容4-3"));values.add(new Value("内容1-4", "内容2-4", "内容3-4", "内容4-4"));dataMap.put("values", values);String outPath = wordUtil.createWord(dataMap);if (outPath.equals(FILE_CREATE_FAIL)) {throw new Exception("文档生成失败");}//转化后本质是doc(x)的word文档。Document document = new Document(outPath);File file = new File(outPath);// 判断有没有父路径,就是判断文件整个路径是否存在if (!file.getParentFile().exists()) {// 不存在就全部创建file.getParentFile().mkdirs();}//将本质是xml的文件转化为真正的doc(x)document.saveToFile(outPath, FileFormat.Docx);//输出生成后的文件路径System.out.println(outPath);}@Data@AllArgsConstructorpublic static class Value {private String value1;private String value2;private String value3;private String value4;}
}
验证
模板:
输出:
java利用freemarker动态生成word文档及动态表格相关推荐
- Java使用FreeMarker自动生成Word文档(带图片和表单)
Java使用FreeMarker自动生成Word文档(带图片和表单) 1 背景 2 目标效果 3 创建Word模板 3.1 创建模板文档 3.2 转换模板文档 3.3 处理模板文档中的占位符 3.4 ...
- Java使用FreeMarker自动生成Word文档
背景:根据模板填充导出word 一.添加依赖 1 <dependency> 2 <groupId>org.freemarker</groupId> 3 <ar ...
- 关于用java编写生成word文档,动态添加数据到word文档的一些心得
关于用java编写生成word文档,动态添加数据到word文档的一些心得,经过翻阅了无数的有用的和无用的资料以后,总算找到了一种靠谱的方法 1.概述 经过反反复复的查阅资料,总算找到了一个靠谱的生成w ...
- Freemarker - 根据模板动态生成word文档
文章目录 Freemarker 根据模板动态生成word文档 Freemarker 介绍: Freemarker 使用: freemarker加载模板目录的方法 参考资料 Freemarker 根据模 ...
- Springboot中使用freemarker动态生成word文档
文章目录 freemarker模板动态生成word文档 前言 准备 简单模板准备 <一> `word 2003` 新建`.doc` 模板 <二> 另存为`.xml` 文件,格式 ...
- 使用FreeMarker自动生成Word文档
使用FreeMarker自动生成Word文档 获取文件路径 创建一个word文档,然后再文档中在文档中写标识,对应代码中的map数据 2.将word转为xml后缀文件,再转为.ftl文件 3.保存路径 ...
- 动态生成word文档原来如此简单!Aspose.Words助力以Java编程方式创建丰富的Word文档
近年来,Word文档的动态生成已成为组成报告,报价,发票和其他类型文档的流行功能.各种制造公司都基于数据库中存储的数据生成发票.在这种情况下,文档自动化可以节省手动文档创建过程中所需的时间,精力和资源 ...
- java根据模板动态生成word文档
模板文档 首先,需要创建一个word模板,我的模板例子如下: 动态生成的文档 根据java代码动态的修改模板生成自己想要的文档,结果如下: 具体代码 代码操作如下:其中进行了文本的替换,图片的插入,以 ...
- 用Aspose.Words for .NET动态生成word文档中的图片或水印
1.概述 在项目中生成word文档,这个功能很普遍的,一般生成都是纯文字或是列表的比较多,便于客户打印,而要把图片也生成到word文档中的需求有些客户也是需要的,例如产品图片.这次我们介绍的是如何利用 ...
最新文章
- 全栈技术实践经历告诉你:开发一个商城小程序要多少钱?
- Android中事件的传递
- 企业运维之域控篇(九)--辅助域强制占用后的操作--清除数据
- flink scala shell命令行使用示例
- [观察,找规律]算法题目训练
- linux父进程循环,LINUX C 父进程建立多个子进程循环非堵塞回收列子
- 前端学习(48):文本缩进和文本对齐
- python 数据模型
- android音频杂音问题_Android 音视频去回声、降噪(Android音频采集及回音消除)(转)...
- Java JSR303 valid
- erlang的dict源码解析(2)
- SVN切换IP,不换路径,快捷方法
- seo和sem的区别是什么?网站seo具体怎么做?
- 日本被动元件是怎样称霸全球的
- 教你用python制作人脸卡通画(附源码)
- 【实战技能】非技术背景经理的技术管理
- robosense激光雷达使用及适配autoware
- 微信商户平台,开通企业付款到用户零钱功能
- 三级分销系统要如何进行推广以及提升曝光度?
- 店铺DSR综合评分的计算维度,淘宝店铺评分结算标准