本文展示了Java批量生成并下载Excel报表为ZIP文件的技术实现。
先看一下生成文件的效果示例:



直接上代码:
java
public void reportDownBatch(HttpServletResponse response) {
// 设置响应的内容类型和头信息
response.setContentType("application/zip");
response.setHeader("Content-Disposition", "attachment; filename=\"" + "report" + "\"");
// 获取输出流
InputStream input = null;
try (
OutputStream outputStream = response.getOutputStream();
ZipOutputStream zos = new ZipOutputStream(outputStream);
) {
String fileName;
ZipEntry zipEntry;
ZipEntry fileEntry;
// 这里以月份作为示例,改为实际获取文件夹名称的方法
List<String> list = Arrays.asList("2025-01", "2025-02", "2025-03");
for (String month : list) {
// 创建ZIP中的文件夹,改为实际文件夹名
fileName = month + "/";
zipEntry = new ZipEntry(fileName);
zos.putNextEntry(zipEntry);
zos.closeEntry();
// 生成文件,改为实际的查询参数及方法
input = exportFile(month);
// 目录里层文件名(文件夹名+文件名),改为实际文件名
fileEntry = new ZipEntry(fileName + month + "-28.xlsx");
zos.putNextEntry(fileEntry);
byte[] buffer = new byte[1024];
int len;
while ((len = input.read(buffer)) > 0) {
zos.write(buffer, 0, len);
}
zos.closeEntry();
input.close();
}
} catch (IOException e) {
log.error(e.getMessage());
e.printStackTrace();
} finally {
try {
if (input != null) {
input.close();
}
} catch (IOException e) {
log.error("关闭输入流出错", e);
}
}
}
public InputStream exportFile(String month) {
// 1.初始化
FillConfig fillConfig = FillConfig.builder().build();
ByteArrayOutputStream os = new ByteArrayOutputStream();
// 2.获取表格模板,下面有模板示例(替换为真实的模板路径)
InputStream inputStream = getClass().getResourceAsStream("/static/excelTemplate.xlsx");
ExcelWriter excelWriter = EasyExcel.write().withTemplate(inputStream).excelType(ExcelTypeEnum.XLSX).file(os).build();
// 3.获取模板第一个sheet页
WriteSheet sheet = EasyExcel.writerSheet(0).build();
// 4.填充表头参数(不需要的话可以直接删除)
Map<String, Object> titleMap = new HashMap<>();
titleMap.put("title", "标题");
excelWriter.fill(titleMap, sheet);
// 5.填充列表数据(替换为实际查询数据的方法)
List<Report> reportList = mapper.getListByMonth(month);
excelWriter.fill(new FillWrapper("reportList", reportList), fillConfig, sheet);
// 如有其他sheet页重复步骤3-5
// 6.结束填充
excelWriter.finish();
InputStream stream = new ByteArrayInputStream(os.toByteArray());
return stream;
}
excel模板示例:

注意参数名称和代码中一致。