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

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

word文档模板:

java中的ftl文件 ftl java_freemarker

java中的ftl文件 ftl java_freemarker_02


转ftl文件:直接将xml文件重命名

java中的ftl文件 ftl java_freemarker_03

二:java后台主要代码

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文件,获取动态值。

java中的ftl文件 ftl java_#if_04


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

java中的ftl文件 ftl java_java_05

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> // 判断=的时候,注意只要一个=符号,而不是==

四:最后运行看效果

java中的ftl文件 ftl java_java中的ftl文件_06