- 设置模板占位符
(模板占位符表头不带点,非表头数据行带点,举例{.ago},{ago}) - 引入easyExcel依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.2.1</version>
</dependency>
- 设置模板数据List对象vo
注:对象的属性名要和模板占位符一致,别忘了加点;如果想要设置非列表的占位符,如果不是很多就直接新建个map对象,很多的话就直接设为对象 - 然后下面是service代码
@Override
public void detailExport(HttpServletResponse response, ProFixedAssetsDto proFixedAssets) throws IOException {
// 加载模板文件为Resource
Resource resource = resourceLoader.getResource("classpath:ExcelTemplate\\固定资产折旧明细表.xlsx");
// 1. 将Resource转换为URL,如果Resource是文件系统中的文件
URL url = resource.getURL();
// 2. 或者,你可以将Resource的内容读取到内存中,然后写入到临时文件
try (InputStream inputStream = resource.getInputStream()) {
// 写入到临时文件
Path tempFilePath = Files.createTempFile("template", ".xlsx");
Files.copy(inputStream, tempFilePath, StandardCopyOption.REPLACE_EXISTING);
// 响应内容类型
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding("utf-8");
// 设置文件下载名
String fileName = URLEncoder.encode("固定资产折旧明细表.xlsx", "UTF-8");
response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename*=UTF-8''" + fileName);
// 使用EasyExcel构建ExcelWriter(直接写入到response的OutputStream)
try (ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream(), ProDepreciationExportVo.class).withTemplate(tempFilePath.toFile()).build()) {
// 构建WriteSheet
WriteSheet sheet = EasyExcel.writerSheet().build();
// 填充表头
Map<String, Object> map = new HashMap();
Integer lastYear;
Integer thisYear;
Integer depreciationYear = proFixedAssets.getDepreciationYear();
if (depreciationYear == null) {
lastYear = LocalDate.now().getYear() - 1;
thisYear = LocalDate.now().getYear();
} else {
lastYear = depreciationYear - 1;
thisYear = depreciationYear;
}
map.put("lastYear", lastYear);
map.put("thisYear", thisYear);
excelWriter.fill(map, sheet);
// 填充list表格数据
FillConfig fillConfig = FillConfig.builder()
// 开启填充换行
.forceNewRow(true)
.build();
List<ProDepreciationExportVo> proDepreciationExportVoList = getDepreciationExportVoList(proFixedAssets);
excelWriter.fill(proDepreciationExportVoList, fillConfig, sheet);
}
// 清理临时文件
Files.delete(tempFilePath);
}
}
版本2:
@Override
public void detailExport2(HttpServletResponse response, ProFixedAssetsDto proFixedAssets) throws IOException {
ServletOutputStream out = response.getOutputStream();
EasyExcelUtil.initResponse(response, "报价单");
// 文件模板输入流,将 excel 模板放到 resources 目录下
InputStream templateFile = new ClassPathResource("ExcelTemplate\\固定资产折旧明细表.xlsx").getInputStream();
ExcelWriter writer = EasyExcel
.write(out)
.withTemplate(templateFile)
.build();
WriteSheet sheet = EasyExcel.writerSheet().build();
Map<String, Object> map = new HashMap();
map.put("lastYear", LocalDate.now().getYear() - 1);
map.put("thisYear", LocalDate.now().getYear());
writer.fill(map, sheet);
// 填充配置,开启组合填充换行
FillConfig fillConfig = FillConfig.builder().forceNewRow(true).build();
// 填充列表占位符
writer.fill(getDepreciationExportVoList(proFixedAssets), fillConfig, sheet);
//填充完成
writer.finish();
}
工具包:
import javax.servlet.http.HttpServletResponse;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
public class EasyExcelUtil {
/**
* 初始化响应体
* @param response 请求头
* @param fileName 导出名称
*/
public static void initResponse(HttpServletResponse response, String fileName) {
// 最终文件名:文件名_(截止yyyy-MM-dd) --> 这块地方得根据你们自己项目做更改了
String finalFileName = fileName + LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));;
// 设置content—type 响应类型
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
try {
// 这里URLEncoder.encode可以防止中文乱码
finalFileName = URLEncoder.encode(finalFileName, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
response.setHeader("Content-disposition", "attachment;filename=" + finalFileName + ".xlsx");
}
}
参考文章:https://blog.youkuaiyun.com/xhmico/article/details/137461979