简单介绍
概述
FreeMarker 是一款 模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件
适用场景
- **模板化文档生成:**FreeMarker 是一个模板引擎,适用于生成具有固定格式的文档,比如发票、报告或合同。这些文档的结构和格式是固定的,但内容可以动态变化。
- **内容动态填充:**使用 FreeMarker,你可以创建 Word 文档模板,并在运行时将数据填充到模板中,生成最终的 Word 文件。例如,生成个性化的信件或文档报告。
- **简单文档生成:**适用于文档结构较为简单的场景,比如只包含文本和基本格式的文档。
准备工作
开发环境
正式开始之前,依然给出本文所基于的环境,避免环境问题可能给大家带来的影响。
- JDK 17(理论上推荐不低于 1.8 版本)
- IDEA INTELLIJ
- SpringBoot 2.x
添加 FreeMarker 依赖
xml 代码解读复制代码
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-freemarkerartifactId>
dependency>
添加 FreeMarker 相关配置
添加依赖后,我们需要在项目配置文件 application.yml 中添加 FreeMarker 的相关配置。
yml 代码解读复制代码spring:
freemarker:
# 模板路径
template-loader-path: template-loader-path: classpath:/static/templates/
# 模板后缀名
suffix: .ftl
# 页面编码
charset: utf-8
# 页面缓存
cache: false
# 文档类型
content-type: text/html
代码实现
工具类和模板
工具类
java 代码解读复制代码import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.URLEncoder;
import java.util.Map;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import com.itextpdf.html2pdf.ConverterProperties;
import com.itextpdf.html2pdf.HtmlConverter;
import com.itextpdf.layout.font.FontProvider;
import lombok.extern.slf4j.Slf4j;
import freemarker.template.Template;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;
@Slf4j
@Component
public class ExportWordUtil {
@Autowired
private FreeMarkerConfigurer freeMarkerConfigurer;
private String encoding="utf-8";
/**
* 获取模板
*
* @param name
* @return
* @throws Exception
*/
public Template getTemplate(String name) throws Exception {
return freeMarkerConfigurer.getConfiguration().getTemplate(name);
}
/**
* 导出word文档到指定目录
*
* @param fileName
* @param tplName
* @param data
* @throws Exception
*/
public void exportDocToProjectRoot(String fileName, String tplName, Map data) throws Exception {
// 如果目录不存在,则创建目录
Writer writer = new BufferedWriter(
new OutputStreamWriter(new FileOutputStream(fileName), encoding));
getTemplate(tplName).process(data, writer);
}
/**
* 导出word文档到客户端
*
* @param response
* @param fileName
* @param tplName
* @param data
* @throws Exception
*/
public void exportDocToClient(HttpServletResponse response, String fileName, String tplName, Map data)
throws Exception {
response.reset();
response.setCharacterEncoding("UTF-8");
response.setContentType("application/msword");
response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileName, "UTF-8"));
// 把本地文件发送给客户端
Writer out = response.getWriter();
Template template = getTemplate(tplName);
template.process(data, out);
out.close();
}
}
模板
ftl代码解读复制代码hello,${name}!
功能实现
导出到项目根目录
controller代码
java 代码解读复制代码import com.example.freemarker.util.ExportWordUtil;
import com.example.freemarker.util.HtmlUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.time.LocalDate;
import java.util.HashMap;
import java.util.Map;
/**
* FreeMarker测试案例
*
* @PACKAGE_NAME: com.example.freemarker.controller
* @author: zqy
* @DATE: 2024/8/30 15:47
*/
@RestController
@RequestMapping("/freemarker")
@Slf4j
public class HelloController {
@Autowired
private ExportWordUtil exportWordUtil;
@GetMapping("/word/export/to-project-root")
public void exportWordToProjectRoot() throws Exception {
String fileName = "test.docx"; // 文件名称
Map dataMap = new HashMap<>();
dataMap.put("name", "freemarker导出word"); // 设置要导出的数据,这里的title要和word模板中保持一致
exportWordUtil.exportDocToProjectRoot( fileName, "test.ftl", dataMap);
}
}
导出到客户端
controller代码
java 代码解读复制代码import com.example.freemarker.util.ExportWordUtil;
import com.example.freemarker.util.HtmlUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.time.LocalDate;
import java.util.HashMap;
import java.util.Map;
/**
* FreeMarker测试案例
*
* @PACKAGE_NAME: com.example.freemarker.controller
* @author: zqy
* @DATE: 2024/8/30 15:47
*/
@RestController
@RequestMapping("/freemarker")
@Slf4j
public class HelloController {
@Autowired
private ExportWordUtil exportWordUtil;
@GetMapping("/word/export/to-client")
public void exportWordToClient(HttpServletRequest request, HttpServletResponse response) throws Exception {
String fileName = "test.doc"; // 文件名称
Map dataMap = new HashMap<>();
dataMap.put("name", "freemarker导出word"); // 设置要导出的数据,这里的title要和word模板中保持一致
exportWordUtil.exportDocToClient(response, fileName, "test.ftl", dataMap);
}
}
评论记录:
回复评论: