使用Java实现下载多Sheet的Excel并将阿里云OSS文件下载最终写入Zip文件

本文详细介绍了如何在Java中利用ZipOutputStream和EasyExcel将查询数据分组写入多Sheet的Excel,同时将阿里云OSS文件下载并压缩后整合到同一个Zip文件中。在处理过程中,注意了文件名的唯一性、OSS URL的处理以及异步操作以提高效率。在实际操作中遇到了Zip条目重复和OSS文件路径处理的问题,并给出了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

最近有个需求,是需要根据后台系统给的筛选条件导出一个Zip文件,Zip文件最终包含的数据有以下两个方面

  1. 查询出指定得数据,并将数据根据某个字段进行分组并 分为多个Sheet写入excel, 写入最终的Zip
  2. 将查询出的数据的 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值