分享不易,喜欢请关注
导出多个Excel文件,并压缩成zip包的功能,这是很多业务系统都需要的功能。本文将结合easypoi实现。
导入easypoi项目
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-spring-boot-starter</artifactId>
<version>4.2.0</version>
</dependency>
创建Excel模板
模板是处理复杂Excel的简单方法,复杂的Excel样式,可以用Excel直接编辑,完美地避开了代码编写样式的雷区,同时指令的支持,也提了模板的有效性。创建的模板示例如图所示:
基本语法如下:
- 空格分割
- 三目运算 {{test ? obj:obj2}}
- n: 表示 这个cell是数值类型 {{n:}}
- le: 代表长度{{le:()}} 在if/else 运用{{le:() > 8 ? obj1 : obj2}}
- fd: 格式化时间 {{fd:(obj;yyyy-MM-dd)}}
- fn: 格式化数字 {{fn:(obj;###.00)}}
- fe: 遍历数据,创建row
- !fe: 遍历数据不创建row
- $fe: 下移插入,把当前行,下面的行全部下移.size()行,然后插入
- #fe: 横向遍历
- v_fe: 横向遍历值
- !if: 删除当前列 {{!if:(test)}}
- 单引号表示常量值 '' 比如'1' 那么输出的就是 1
- &NULL& 空格
- ]] 换行符 多行遍历导出
- sum: 统计数据
CBFile模板类
不同的数据,可能需要定制不一样的模板。因此,可以定制一个模板类,以实现对模板数据的管理:
@Data
public class CBFile {
private Integer id;//保存的数据库里模板文件的标识
private String name;//模板名称
private String url;//储存地址
}
构建导出excel方法并压缩
//datas为需要导出的数据,其中key为压缩包里的Excel文件名,value是数据
//name为压缩包名称
public void downZip(Map<String,Map<String,Object>> datas,String name) throws IOException {
response.setContentType("application/zip");
response.setHeader("Content-Disposition", "attachment;filename="+name+".zip");
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ZipOutputStream zos = new ZipOutputStream(bos);
ServletOutputStream out = response.getOutputStream();
for(String key:datas.keySet()) {
Map<String,Object> data=datas.get(key);
String path=getFilePath((Integer) data.get("fileId"));//这是获得模板文件路径的方法,根据实际情况修改。fileId对应的是上面的文件id
TemplateExportParams params=new TemplateExportParams(path);
//使用模板生成excel文件
Workbook workbook=ExcelExportUtil.exportExcel(params, data);
//存放在压缩包里
ZipEntry zipEntry = new ZipEntry(name+"/"+key+".xlsx");
zos.putNextEntry(zipEntry);
workbook.write(new NonCloseableOutputStream(zos));
//bos.writeTo(zos);
zos.closeEntry();
}
zos.close();
byte[] bytes = bos.toByteArray();
//setting content-type and zip file name
response.setContentType("application/zip");
response.setHeader("Content-Disposition", "attachment; filename="+name+".zip");
out.write(bytes);
out.flush();
}
分享不易,喜欢请点关注