导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
工具类
package com.gdgxkj.rep.proposal.utils.export;
import freemarker.template.Configuration;
import freemarker.template.Template;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.URLEncoder;
import java.util.Map;
/**
*@BelongsPackage: com.gdgxkj.rep.proposal.utils.export
*@Author: chenlf
*@CreateTime: 2023-03-21
*@Description: FreeMarkerUtil
*@Version: 1.0
*/
public class FreeMarkerUtil {
/**
* @title: ExportExcel
* @description: 导出excel
* @author: chenlf
* @date: 2023/4/24
* @param: fileName
* @param: templateName
* @param: data
* @return: void
*/
public static void ExportExcel(String fileName, String templateName, Map<String,Object> data) throws IOException {
HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
response.reset();
response.setCharacterEncoding("UTF-8");
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8") + ".xlsx");
OutputStreamWriter writer = null;
try {
Template template = FreeMarkerUtil.getTemplate(templateName);
writer = new OutputStreamWriter(response.getOutputStream(), "UTF-8");
template.process(data, writer);
writer.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (writer != null) {
writer.close();
}
}
}
private static Template getTemplate(String templateName) throws IOException {
Configuration configuration = new Configuration(Configuration.VERSION_2_3_26);
configuration.setDefaultEncoding("utf-8");
configuration.setClassForTemplateLoading(FreeMarkerUtil.class,"/template/freemarker");
return configuration.getTemplate(templateName);
}
}
模板
将Excel文档另存为.xml文件
然后采用freemarker标签动态调整填充数据即可
调用
Map<String,Object> data = new HashMap<>();
data.put("XX", "test");
data.put("results", resultList);
try {
FreeMarkerUtil.ExportExcel("统计", "rep-undertake-suggest.xml", data);
} catch (Exception e) {
e.printStackTrace();
}