0
点赞
收藏
分享

微信扫一扫

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

素的盐 2022-04-17 阅读 48

这里写目录标题

freemark介绍

主要文件结构

在这里插入图片描述

引入依赖

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

添加配置信息

#设定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

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);
	}
}

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();
	}
}

前端模板文件准备

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

运行效果

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

举报

相关推荐

0 条评论