easyexcel 导出 导出多个文件合成一个压缩包返回

//视频链接
https://www.bilibili.com/video/av99022731/?p=2

导出要求,根据选中多少人,每个人的信息就是一个excel文件,每个文件有两个sheet页面。最后多个文件压缩成一个压缩包返回前端。下面是导出的文件图片

导出多个文件最后压缩一个文件
在这里插入图片描述

//controller 

  @Autowired
    private EasyExcelKeyAccountService easyExcelKeyAccountService;
    @ApiOperation(value = "重点账号导出")
    @ApiOperationSupport(order = 1)
    @PostMapping("/keyAccountExport")
    public void keyAccountExport(@RequestBody List<ElementAccountCommonVO> listNew , HttpServletResponse response)throws IOException {
        this.easyExcelKeyAccountService.keyAccountExport(listNew,response);
    }
//实现类

  @Override
    public void keyAccountExport(List<ElementAccountCommonVO> listNew, HttpServletResponse response) {
        try {
            // 登录用户校验
            Long userId = ThreadLocalHolder.getUserIdLocal();
            Assert.isTrue(ObjectUtil.isNotNull(userId), "获取登录用户信息失败,查询失败");
            response.setHeader("content-type", "application/octet-stream");
            response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + URLEncoder.encode("keyAccounts", "UTF-8") + ".zip");
            response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");   // 暴露文件名
            //循环集合 导出多个excel 集合循环次数就是excel个数
            for (int m = 0; m < listNew.size(); m++) {
                //要导出sheet0的集合数据
                List<ElementAccountDetailsExcel> warningDetails = new ArrayList();
                //要导出sheet1的集合数据
                List<ElementAccountExcel> resList =  new ArrayList();
                //导出excel 这个方法里面就是导出 (一个 )excel 里面有两个sheet页面的excel文件,上面循环就是导出多个   文件
                createExcel(m, warningDetails, resList);
            }
            //创建压缩包路径名称
            String zipFilePath = keyAccountExportPath + File.separator + "keyAccounts.zip";
            // 创建输出流
            FileOutputStream fos = new FileOutputStream(zipFilePath);
            ZipOutputStream zos = new ZipOutputStream(fos);
            // 压缩文件
            for (int i = 0; i < listNew.size(); i++) {
                // 获取当前 Excel 文件路径
                String excelFilePath = keyAccountExportPath + File.separator + i + ".xlsx";
                File file = new File(excelFilePath);
                if (file.exists()) {
                    addFileToZip(file, zos);
                }
            }
            // 关闭流
            zos.close();
            fos.close();
        } catch (Exception e) {
            e.printStackTrace();
            log.error("导出重点账号失败:{}", e);
        }
        //压缩完之后获取文件返回前端流
        try {
            // 创建 File 对象
            File file = new File(keyAccountExportPath + File.separator + "keyAccounts.zip");
            // 读取文件内容并写入响应输出流
            FileInputStream fileInputStream = new FileInputStream(file);
            OutputStream outputStream = response.getOutputStream();
            byte[] buffer = new byte[4096];
            int bytesRead;
            while ((bytesRead = fileInputStream.read(buffer)) != -1) {
                outputStream.write(buffer, 0, bytesRead);
            }
            // 关闭流
            fileInputStream.close();
            outputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
            log.error("下载文件返回前端流失败:{}", e);
        }
        //压缩完删除之前的文件
        for (int i = 0; i < listNew.size(); i++) {
            String excelFilePath = keyAccountExportPath + File.separator + i + ".xlsx";
            File file = new File(excelFilePath);
            if (file.exists()) {
                file.delete();
            }
        }
    }
 //里面主要创建两个sheet页面 然后生成一个文件   这是上面的方法
    private void createExcel(int m, List<ElementAccountDetailsExcel> warningDetails, List<ElementAccountExcel> resList) {
        ExcelWriter excelWriter = null;
        //判断文件夹是否存在 不存在就创建一个  keyAccountExportPath是你存入本地的路径
        File files = new File(keyAccountExportPath);
        if (!files.exists()) {
            files.mkdirs();
        }
        String fileName = keyAccountExportPath + File.separator + m + ".xlsx";
        try {
            // 这里 sheet1
            excelWriter = EasyExcel.write(fileName).build();
            // 这里 sheet0
            // 每次都要创建writeSheet 这里注意必须指定sheetNo 而且sheetName必须不一样
            WriteSheet writeSheet2 = EasyExcel.writerSheet(0, "重点账号信息" + 0).build();
            //每个class根据自己的来 可以替换 实体类加上注解 
            writeSheet2.setClazz(ElementAccountExcel.class);
            // 分页去数据库查询数据 这里可以去数据库查询每一页的数据
            excelWriter.write(resList, writeSheet2);


            // 每次都要创建writeSheet 这里注意必须指定sheetNo 而且sheetName必须不一样
            WriteSheet writeSheet1 = EasyExcel.writerSheet(1, "预警信息" + 1).build();
                //每个class根据自己的来 可以替换 实体类加上注解 
            writeSheet1.setClazz(ElementAccountDetailsExcel.class);
            // 分页去数据库查询数据 这里可以去数据库查询每一页的数据
            excelWriter.write(warningDetails, writeSheet1);
        } finally {
            // 千万别忘记finish 会帮忙关闭流
            if (excelWriter != null) {
                excelWriter.finish();
            }
        }
    }
  /**
     * 文件添加压缩包
     * @param file
     * @param zipOutputStream
     * @throws IOException
     */
    private static void addFileToZip(File file, ZipOutputStream zipOutputStream) throws IOException {
        FileInputStream fis = new FileInputStream(file);
        ZipEntry zipEntry = new ZipEntry(file.getName());
        zipOutputStream.putNextEntry(zipEntry);

        byte[] buffer = new byte[1024];
        int length;
        while ((length = fis.read(buffer)) > 0) {
            zipOutputStream.write(buffer, 0, length);
        }

        zipOutputStream.closeEntry();
        fis.close();
    }
好的,您可以使用Java中的ZipOutputStream类来实现压缩多个Excel文件。以下是一个简单的示例代码: ```java import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.metadata.Sheet; import com.alibaba.excel.metadata.Table; import com.alibaba.excel.support.ExcelTypeEnum; import org.apache.commons.compress.archivers.zip.ZipArchiveEntry; import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream; import java.io.*; import java.util.ArrayList; import java.util.List; public class ExportExcel { public static void main(String[] args) throws IOException { // 创建多个Excel文件 List<File> fileList = createExcelFiles(); // 创建压缩包文件 File zipFile = new File("excel_files.zip"); ZipArchiveOutputStream zipOutputStream = new ZipArchiveOutputStream(zipFile); zipOutputStream.setMethod(ZipArchiveOutputStream.DEFLATED); // 将多个Excel文件压缩到压缩包中 for (File file : fileList) { ZipArchiveEntry entry = new ZipArchiveEntry(file.getName()); entry.setSize(file.length()); zipOutputStream.putArchiveEntry(entry); FileInputStream fis = new FileInputStream(file); byte[] buffer = new byte[1024]; int len; while ((len = fis.read(buffer)) > 0) { zipOutputStream.write(buffer, 0, len); } fis.close(); zipOutputStream.closeArchiveEntry(); } // 关闭ZipOutputStream流 zipOutputStream.finish(); zipOutputStream.close(); // 删除临时Excel文件 for (File file : fileList) { file.delete(); } } private static List<File> createExcelFiles() throws FileNotFoundException { List<File> fileList = new ArrayList<>(); for (int i = 1; i <= 3; i++) { // 创建Excel文件 File file = new File("excel_" + i + ".xlsx"); OutputStream out = new FileOutputStream(file); // EasyExcel导出数据 ExcelWriter writer = new ExcelWriter(out, ExcelTypeEnum.XLSX); Sheet sheet = new Sheet(1, 0); sheet.setSheetName("Sheet1"); Table table = new Table(1); List<List<String>> data = new ArrayList<>(); for (int j = 1; j <= 10; j++) { List<String> row = new ArrayList<>(); row.add("Data" + j); data.add(row); } table.setData(data); writer.write0(table, sheet); writer.finish(); // 添加Excel文件到列表中 fileList.add(file); } return fileList; } } ``` 在上面的代码中,我们首先创建了3个Excel文件,然后将它们压缩到一个名为“excel\_files.zip”的压缩包中。最后,我们删除了临时的Excel文件。注意,我们使用了Apache Commons Compress库来实现压缩操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值