SpringBoot 动态生成多个Excel文件以压缩包.zip格式下载

前言:

文件下载的场景很多(还不是需求丰富嘛~),那么什么是动态生成文件呢,就是用户选择文件内容,服务器端根据选择的数据生成某个格式的文件然后下载到客户端。单个嘛直接下载,多个打包下载咯!

悄悄说下,Markdown蛮好用哈 =.=

项目场景:

项目中有个数据导出excel的需求,而且是批量,那么就要打包咯

解决步骤:

基本实现如下:
1、生成文件
2、保存到临时目录 || 缓存到内存中
3、将文件打包下载

我不想废话了,上代码:

直接把文件输出流放到压缩流ZipOutputStream

 List<String> fields = new ArrayList<>();
        fields.add("字段1");
        fields.add("字段2");
        fields.add("字段3");
        HSSFWorkbook workbook = excelUtil.getNewExcel("压缩文件测试", fields);
        try {
            response.setContentType("application/zip; charset=UTF-8");
            //返回客户端浏览器的版本号、类型
            String agent = request.getHeader("USER-AGENT");
            String downloadName = "压缩文件测试.zip";
            //针对IE或者以IE为内核的浏览器:
            if (agent.contains("MSIE") || agent.contains("Trident")) {
                downloadName = java.net.URLEncoder.encode(downloadName, "UTF-8");
            } else {
                downloadName = new String(downloadName.getBytes("UTF-8"), "ISO-8859-1");
            }
            response.setHeader("Content-disposition", "attachment;filename=" + downloadName);
			
            ZipOutputStream zipOutputStream = new ZipOutputStream(response.getOutputStream());
			//多个从这里就可遍历了
			// --start
            ZipEntry entry = new ZipEntry("第一个文件名.xls");
            zipOutputStream.putNextEntry(entry);

            ByteOutputStream byteOutputStream = new ByteOutputStream();
            workbook.write(byteOutputStream);
            byteOutputStream.writeTo(zipOutputStream);
//            zipOutputStream.write(workbook.getBytes());
            byteOutputStream.close();
            zipOutputStream.closeEntry();
            // --end
            zipOutputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

生成excel文件也贴一下,如下:

public static HSSFWorkbook getNewExcel(String formName, List<String> fields) {
        //新建excel对象
        HSSFWorkbook workbook = new HSSFWorkbook();
        //新建工作表
        HSSFSheet sheet = workbook.createSheet(formName);
        // 设置表格默认列宽度为20个字节
        sheet.setDefaultColumnWidth((short) 20);
        // 生成一个样式
        HSSFCellStyle style = workbook.createCellStyle();
        // 生成一个字体
        HSSFFont font = workbook.createFont();
        font.setFontHeightInPoints((short) 12);
        //字体应用到当前样式
        style.setFont(font);
        //创建表格行
        HSSFRow row = sheet.createRow(0);
        //设置表单名称
        row.createCell(0).setCellValue(formName);
        if (fields.size() - 1 > 0) {
            //合并单元格
            sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, fields.size() - 1));
        }
        HSSFRow row1 = sheet.createRow(sheet.getLastRowNum() + 1);
        //设置列标题行
        for (int i = 0; i < fields.size(); i++) {
            row1.createCell(i).setCellValue(fields.get(i));
        }
        return workbook;
    }

就到这里,欢迎留言!

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 18
    评论
使用Java可以将多个Excel文档存入一个文档并进行压缩的方法有多种。其中一种简单的实现方式如下: 首先,需要导入Apache POI的相关依赖库,POI提供了Java操作Office文档的功能。 1. 创建一个新的Excel文档(Workbook)对象,使用POI的Workbook类。可以使用HSSFWorkbook类(用于处理.xls格式)或XSSFWorkbook类(用于处理.xlsx格式)根据需要选择。如:HSSFWorkbook workbook = new HSSFWorkbook(); 2. 通过创建一个新的Sheet对象,使用workbook对象的createSheet方法。如:Sheet sheet = workbook.createSheet("Sheet1"); 3. 编写代码读取每个要存储的Excel文档,可以使用POI的Workbook类打开每个Excel文档。如:Workbook inputWorkbook = WorkbookFactory.create(new File("input.xlsx")); 4. 通过创建新的Row和Cell对象,并使用setCellValue方法将要存储的数据写入这些Cell中。如:Cell cell = row.createCell(0); cell.setCellValue(value); 5. 将读取的Excel文档的内容复制到新创建的Excel文档中。可以使用POI库的Sheet类的copyRows方法或copySheet方法进行复制。 6. 当需要将多个Excel文档压缩成一个文件时,可以使用Java的ZipOutputStream类来实现。首先创建一个ZipOutputStream对象,然后将新创建的Excel文档以及其他要压缩的文件写入该输出流。如:ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream("output.zip")); 7. 将新创建的Excel文档输出到ZipOutputStream对象中。如:zipOut.putNextEntry(new ZipEntry("output.xlsx")); workbook.write(zipOut); zipOut.closeEntry(); 8. 最后,关闭所有打开的文件和流。 通过以上步骤,我们可以将多个Excel文档存入一个文档中,并将其压缩成一个zip文件。这样可以方便地存储和传输多个Excel文档。需要注意的是,代码实现可能会有所不同,因为具体的实现方式可能依赖于使用的库或工具。以上仅为一种可能的实现方式的简要介绍。
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值