背景
最近有个需求,是需要根据后台系统给的筛选条件导出一个Zip文件,Zip文件最终包含的数据有以下两个方面
- 查询出指定得数据,并将数据根据某个字段进行分组并 分为多个Sheet写入excel, 写入最终的Zip
- 将查询出的数据的 oss的url下载下来压缩为ZIP文件,也一并写入Zip文件
1 需求分析
1.1 ZipOutputStream
既然牵扯到了ZIP文件的下载,那么也就毫无疑问要牵扯到一个类ZipOutputStream,我们来看下这个类的源码:
/**
* This class implements an output stream filter for writing files in the
* ZIP file format. Includes support for both compressed and uncompressed
* entries.
*
* @author David Connelly
*/
public
class ZipOutputStream extends DeflaterOutputStream implements ZipConstants {
public void putNextEntry(ZipEntry e) throws IOException{
}
public synchronized void write(byte[] b, int off, int len){
}
public void closeEntry() throws IOException {
}
翻译过来大概就是:
此类实现了一个输出流过滤器,用于以 ZIP 文件格式写入文件。包括对压缩和未压缩条目的支持。
我摘取了其中三个API,
方法名 | 解释 |
---|---|
putNextEntry | 写入新的 ZIP 文件条目并将流定位到条目数据的开头 |
write | 将指定的字节数组写入ZIP条目中 |
closeEntry | 关闭当前的Entry |
1.2 EasyExcel多Sheet写入
使用EasyExcel将数据写入多Sheet,一般使用其Api,按照如下格式即可。
File fileExcel = new File(xlsxPath);
ExcelWriter excelWriter = EasyExcel.write(fileExcel, User.class).build();
// 对数据分组,然后写入每一个Sheet中
Map<String, List<User>> sheetListMap = requests.stream()
.collect(Collectors.groupingBy(User::getName));
int index = 0;
// 遍历写入sheet中
for (Map.Entry<String, List<User>> entry : sheetListMap.entrySet()) {
String key = entry.getKey();
List<User> value = entry.getValue();
WriteSheet writeSheet = EasyExcel.writerSheet(index++, key).build();
excelWriter