因为需求要生成复杂的word,所以用模板实现下载

一:首先要创建一个word文档模板,将文档另存为xml格式保存,再把xml格式文件修改后缀为ftl文件。

word文档模板:
在这里插入图片描述 在这里插入图片描述
转ftl文件:直接将xml文件重命名
在这里插入图片描述

二:java后台主要代码
1
import freemarker.template.Configuration; import freemarker.template.Template; import java.io.*; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * Created by Newbie on 2018/12/28. */ public class WordUtils { public static File createWord(Map<String, Object> dataMap,String templateName,String filePath) { //创建文件 String name = (int) (Math.random() * 100000) + ".doc"; File file = new File(filePath + templateName + name); try { // 创建配置实例 Configuration configuration = new Configuration(); // 设置编码 configuration.setDefaultEncoding("UTF-8"); // 设置处理空值 configuration.setClassicCompatible(true); // 设置ftl模板文件加载方式(我是将ftl模板文件放在项目中/resources/template包下的) configuration.setClassForTemplateLoading(WordUtils.class, "/template"); // 将模板和数据模型合并生成文件 Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8")); // 获取模板 Template template = configuration.getTemplate(templateName+".ftl"); // 生成文件 template.process(dataMap, out); // 清空缓存 out.flush(); // 关闭流 out.close(); } catch (Exception e) { e.printStackTrace(); } return file; } public static void main(String[] args) { Map map = new HashMap(); map.put("name","孙俪"); map.put("updateTime","2020-02-27"); map.put("education","博士"); map.put("job","人事经理"); map.put("yearsOfWorking",5); map.put("age",35); map.put("address","上海"); map.put("mobile","17625456852"); map.put("email","www.123456@xi.com"); List<Map> list = new ArrayList<>(); Map map1 = new HashMap(); map1.put("startDate", "2010-05-31"); map1.put("endDate", "2014-03-02"); map1.put("schoolName", "清华大学"); map1.put("major", "管理"); map1.put("educationName", "博士"); list.add(map1); Map map2 = new HashMap(); map2.put("startDate", "2006-05-31"); map2.put("endDate", "2010-03-02"); map2.put("schoolName", "清华大学"); map2.put("major", "管理"); map2.put("educationName", "本科"); list.add(map2); map.put("educationList",list); createWord(map, "resume", "D:\\template\\"); } }
三:编辑ftl文件,获取动态值。

在这里插入图片描述
打开文件时无法下手修改,我是用的idea快捷键Ctrl + Alt + L(不区分大小写)将代码格式化,如果无效应该是快捷键冲突了,可以看看是不是网易音乐或者QQ等等其它软件快捷键。格式化之后就很好修改了,支持FreeMarker基本标签。

在这里插入图片描述

FTL常用标签及语法:

  1. 判断对象是否存在 。如: obj可以是任何类型的对象,像集合,实体类,属性等等
    <#if obj??>…</#if>
    <#if obj??> …<#else>…</#if>
    或者
    <#if obj?exists>…</#if>
    <#ifobj?exists> …<#else>…</#if>
  2. 判断是否和某一个值相等
    <#if obj?exists && obj.id==1>…</#if>
    <#if obj?exists && obj.id == 1>…<#else>…</#if>
    注: 必须先判断是否存在,才可比较相等,如果该指定的参数不存在还比较相等的话就回出错;
  3. 获取对象值
    获取普通属性值:${(obj.属性名称)!} 或者 ${属性名称}
    获取日期类值:${obj.属性名称?string(“yyyy-MM-dd HH:mm:ss”)}
    获取金额类值(以数字20为例):
    <#setting number_format=“percent”/> // 设置数字默认输出方式(‘percent’,百分比)
    <#assign answer=20/>        // 声明变量 answer 20
    ${answer?string}          // 转换字符串输出 4,200%
    ${answer?string.number}     // 转换数字输出 42
    ${answer?string.currency}      // 转换货币输出 ¥42.00
    ${answer?string.percent}     // 转换百分比输出 4,200%
  4. 集合
    遍历集合:
    <#list empList! as emp>
    ${emp.name!}
    </#list>
    .
    可以这样遍历集合:
    <#list 0…(empList!?size-1) as i>
    ${empList[i].name!}
    </#list>
    .
    与jstl循环类似,也可以访问循环的状态。
    empList?size    // 取集合的长度
    emp_index:     // int类型,当前对象的索引值
    emp_has_next:    // boolean类型,是否存在下一个对象
    .
    使用<#break>跳出循环
    <#if emp_index = 0><#break></#if>
    .
    集合长度判断
    <#if empList?size != 0></#if> // 判断=的时候,注意只要一个=符号,而不是==
四:最后运行看效果

在这里插入图片描述
在这里插入图片描述