美文网首页
SpringBoot动态生成多个Excel文件以压缩包.zip格

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

作者: 程序猿TODO | 来源:发表于2021-06-28 09:41 被阅读0次

    前言

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

    项目场景

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

    解决步骤

    基本实现如下:

    生成文件
    保存到临时目录 || 缓存到内存中
    将文件打包下载
    我不想废话了,上代码:

    直接把文件输出流放到压缩流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;
        }
    
    

    一些实践总结,欢迎指正!

    相关文章

      网友评论

          本文标题:SpringBoot动态生成多个Excel文件以压缩包.zip格

          本文链接:https://www.haomeiwen.com/subject/qlfqultx.html