这里写自定义目录标题

  • 目标
  • 准备
  • 实现
    • 处理模板
    • 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文档及动态表格相关推荐

  1. Java使用FreeMarker自动生成Word文档(带图片和表单)

    Java使用FreeMarker自动生成Word文档(带图片和表单) 1 背景 2 目标效果 3 创建Word模板 3.1 创建模板文档 3.2 转换模板文档 3.3 处理模板文档中的占位符 3.4 ...

  2. Java使用FreeMarker自动生成Word文档

    背景:根据模板填充导出word 一.添加依赖 1 <dependency> 2 <groupId>org.freemarker</groupId> 3 <ar ...

  3. 关于用java编写生成word文档,动态添加数据到word文档的一些心得

    关于用java编写生成word文档,动态添加数据到word文档的一些心得,经过翻阅了无数的有用的和无用的资料以后,总算找到了一种靠谱的方法 1.概述 经过反反复复的查阅资料,总算找到了一个靠谱的生成w ...

  4. Freemarker - 根据模板动态生成word文档

    文章目录 Freemarker 根据模板动态生成word文档 Freemarker 介绍: Freemarker 使用: freemarker加载模板目录的方法 参考资料 Freemarker 根据模 ...

  5. Springboot中使用freemarker动态生成word文档

    文章目录 freemarker模板动态生成word文档 前言 准备 简单模板准备 <一> `word 2003` 新建`.doc` 模板 <二> 另存为`.xml` 文件,格式 ...

  6. 使用FreeMarker自动生成Word文档

    使用FreeMarker自动生成Word文档 获取文件路径 创建一个word文档,然后再文档中在文档中写标识,对应代码中的map数据 2.将word转为xml后缀文件,再转为.ftl文件 3.保存路径 ...

  7. 动态生成word文档原来如此简单!Aspose.Words助力以Java编程方式创建丰富的Word文档

    近年来,Word文档的动态生成已成为组成报告,报价,发票和其他类型文档的流行功能.各种制造公司都基于数据库中存储的数据生成发票.在这种情况下,文档自动化可以节省手动文档创建过程中所需的时间,精力和资源 ...

  8. java根据模板动态生成word文档

    模板文档 首先,需要创建一个word模板,我的模板例子如下: 动态生成的文档 根据java代码动态的修改模板生成自己想要的文档,结果如下: 具体代码 代码操作如下:其中进行了文本的替换,图片的插入,以 ...

  9. 用Aspose.Words for .NET动态生成word文档中的图片或水印

    1.概述 在项目中生成word文档,这个功能很普遍的,一般生成都是纯文字或是列表的比较多,便于客户打印,而要把图片也生成到word文档中的需求有些客户也是需要的,例如产品图片.这次我们介绍的是如何利用 ...

最新文章

  1. 全栈技术实践经历告诉你:开发一个商城小程序要多少钱?
  2. Android中事件的传递
  3. 企业运维之域控篇(九)--辅助域强制占用后的操作--清除数据
  4. flink scala shell命令行使用示例
  5. [观察,找规律]算法题目训练
  6. linux父进程循环,LINUX C 父进程建立多个子进程循环非堵塞回收列子
  7. 前端学习(48):文本缩进和文本对齐
  8. python 数据模型
  9. android音频杂音问题_Android 音视频去回声、降噪(Android音频采集及回音消除)(转)...
  10. Java JSR303 valid
  11. erlang的dict源码解析(2)
  12. SVN切换IP,不换路径,快捷方法
  13. seo和sem的区别是什么?网站seo具体怎么做?
  14. 日本被动元件是怎样称霸全球的
  15. 教你用python制作人脸卡通画(附源码)
  16. 【实战技能】非技术背景经理的技术管理
  17. robosense激光雷达使用及适配autoware
  18. 微信商户平台,开通企业付款到用户零钱功能
  19. 三级分销系统要如何进行推广以及提升曝光度?
  20. 店铺DSR综合评分的计算维度,淘宝店铺评分结算标准

热门文章

  1. 小霸王游戏机手柄(二)——代码读取
  2. 机械制图之正投影法基本性质
  3. Java网络编程(第四版)
  4. 什么时候用created,什么时候用mounted
  5. iQOO Z7和iQOO Z7x区别 参数对比评测
  6. 12306退票后多久能重新买同一车次
  7. 数据库备份的三种方式
  8. GOOGLE无法访问的解决
  9. 学习vue中v-on的内容
  10. 数据结构(C语言版)严蔚敏->排序