【详细】springboot整合freemarker实现导出数据到word文档功能

freemark介绍

FreeMarker 是一款 模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。详细文档参考官方网址http://freemarker.foofun.cn/

主要文件结构

在这里插入图片描述

引入依赖

在pom.xml中引入freemarker依赖

<!-- 引入 freemarker 模板依赖 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-freemarker</artifactId>
		</dependency>

添加配置信息

在application.properties中添加freemarker配置信息

#设定ftl文件路径
spring.freemarker.template-loader-path=classpath:/templates
# 关闭缓存, 即时刷新, 上线生产环境需要改为true
spring.freemarker.cache=false
spring.freemarker.charset=UTF-8
spring.freemarker.check-template-location=true
spring.freemarker.content-type=text/html
spring.freemarker.expose-request-attributes=true
spring.freemarker.expose-session-attributes=true
spring.freemarker.request-context-attribute=request
spring.freemarker.suffix=.ftl

编写Controller

ExportDocController.java

package com.example.controller;

import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import com.example.utils.ExportWordUtil;

@RestController
@RequestMapping("/export")
public class ExportDocController {
	@RequestMapping(value = "/exportWord", method = RequestMethod.GET)
	public void exportWord(HttpServletRequest request, HttpServletResponse response) throws Exception {
		String fileName = "测试.doc"; // 文件名称
		Map<String, Object> dataMap = new HashMap<>();
		dataMap.put("title", "freemarker导出word"); // 设置要导出的数据,这里的title要和word模板中保持一致
		new ExportWordUtil("UTF-8").exportDoc(response, fileName, "test.ftl", dataMap);
	}
}

ExportWordUtil.java 导出文件的工具类

package com.example.utils;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.URLEncoder;
import java.util.Map;

import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import freemarker.template.Configuration;
import freemarker.template.Template;

public class ExportWordUtil {
	private static Logger logger = LoggerFactory.getLogger(ExportWordUtil.class);
	private Configuration configuration;
	private String encoding;
	private String exportPath = "D:\\test\\";

	/**
	 * 构造函数 配置模板路径
	 * 
	 * @param encoding
	 */
	public ExportWordUtil(String encoding) {
		this.encoding = encoding;
		configuration = new Configuration();
		configuration.setDefaultEncoding(encoding);
		configuration.setClassForTemplateLoading(this.getClass(), "/templates/freemarker");
	}

	/**
	 * 获取模板
	 * 
	 * @param name
	 * @return
	 * @throws Exception
	 */
	public Template getTemplate(String name) throws Exception {
		return configuration.getTemplate(name);
	}

	/**
	 * 导出word文档到指定目录
	 * 
	 * @param fileName
	 * @param tplName
	 * @param data
	 * @throws Exception
	 */
	public void exportDocFile(String fileName, String tplName, Map<String, Object> data) throws Exception {
		logger.debug("导出word到D:\test");
		// 如果目录不存在,则创建目录
		File exportDirs = new File(exportPath);
		if (!exportDirs.exists()) {
			exportDirs.mkdirs();
		}
		Writer writer = new BufferedWriter(
				new OutputStreamWriter(new FileOutputStream(exportPath + fileName), encoding));
		getTemplate(tplName).process(data, writer);
	}

	/**
	 * 导出word文档到客户端
	 * 
	 * @param response
	 * @param fileName
	 * @param tplName
	 * @param data
	 * @throws Exception
	 */
	public void exportDoc(HttpServletResponse response, String fileName, String tplName, Map<String, Object> 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();
	}
}

前端模板文件准备

新建一个word文档,里面的表达式是你controller里面要设置的值,这里写的title,和controller里面的对应

在这里插入图片描述

文件另存为xml格式

在这里插入图片描述

xml文件的内容

在这里插入图片描述

复制xml文件到templates中freemarker目录下,并改变后缀为ftl格式,这里的名称要和controller里面的名称保持一致

在这里插入图片描述

注意事项:工具类中这个路径要和模板的路径保持一致,可以根据自己的情况进行修改
在这里插入图片描述

运行效果

访问http://localhost:8088/export/exportWord,推荐用谷歌浏览器测试
打开文档里面之前设置的title变成了controller里面设置的值

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

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值