excel按模板文件导出多个文件并压缩为ZIP格式返回前端

思路:先准备好模板文件和与之对应的实体类,数据库数据等,还是之前思路,根据查出的数据,填充模板文件,生成一个临时文件,最后将这些个临时文件打包为zip返回前端,并将多个临时文件删除掉就ok了

紧接着就是copy

java 复制代码
    @Log(title = "表格管理-批量导出", businessType = BusinessType.EXPORT)
    @Operation(description = "下载表格")
    @PostMapping("/imports")
    public void excelimport(HttpServletResponse response, @RequestBody List<FormVo> formVo) throws IOException {
        response.setContentType("application/zip");
        response.setCharacterEncoding("UTF-8");
        String fileName = "/home/ag/project/files/templates/" + System.currentTimeMillis() + ".zip";
        response.setHeader("Content-Disposition", "attachment; filename=\"" + URLEncoder.encode(fileName, "UTF-8"));
        FileOutputStream fos = new FileOutputStream(fileName);
        ZipOutputStream zos = new ZipOutputStream(fos);
        ExcelWriter writer = null;
        ArrayList<String> o = new ArrayList<>();
        for (FormVo f : formVo) {
            // 模板文件路径   switch case部分是我的业务代码(多个不同的模板文件)  各位就不用看了,删掉即可
            String templateFilePath;
            String type = f.getType();
            switch (type) {
                case "1":
                    templateFilePath = form;
                    break;
                case "2":
                    templateFilePath = formCao;
                    break;
                case "3":
                    templateFilePath = formLin;
                    break;
                case "4":
                    templateFilePath = formYuan;
                    break;
                case "5":
                    templateFilePath = formShui;
                    break;
                case "6":
                    templateFilePath = formJian;
                    break;
                case "7":
                    templateFilePath = formQi;
                    break;
                default:
                    throw new RuntimeException("表格类型有误");
            }
            // 创建 ExcelWriter 实例
            String fileName1 = "/home/ag/project/files/templates/" + System.currentTimeMillis() + "听忆计划表.xlsx";
            writer = EasyExcel
                    // 写入到临时文件
                    .write(fileName1)
                    // 指定模板
                    .withTemplate(templateFilePath)
                    .build();

            WriteSheet sheet = EasyExcel.writerSheet().build();

            FillConfig fillConfig = FillConfig.builder()
                    // 开启填充换行
                    .forceNewRow(true)
                    .build();
            List list = getjituan1(f, f.getType());
            //计算公式
            Workbook workbook = writer.writeContext().writeWorkbookHolder().getWorkbook();
            workbook.setForceFormulaRecalculation(true);
            // 执行填充操作
            writer.fill(list, fillConfig, sheet);
            o.add(fileName1);
//            // 压缩文件
            writer.finish();
        }
        for (String f:o){
            // 压缩文件
            File file1 = new File(f);
            addFileToZip(file1, zos);
//            删除临时文件
            deleteFile(f);
        }

        zos.close();
        //将压缩文件输入流传给response输出流
        InputStream fileInputStream = new FileInputStream(fileName);
        OutputStream outputStream = response.getOutputStream();
        byte[] bytes = new byte[1024 * 8];
        int len;
        while ((len = fileInputStream.read(bytes)) != -1) {
            outputStream.write(bytes, 0, len);
        }
        outputStream.close();
        fileInputStream.close();
    }

    static void deleteFile(String path) {
        File file = new File(path);
        if (file.exists()) {
            file.delete();
        }
    }

    public static void addFileToZip(File file, ZipOutputStream zos) throws IOException {
        InputStream fileInputStream = new FileInputStream(file);
        //zip中要放文件称为zipEntry
        ZipEntry zipEntry = new ZipEntry(file.getName());
        zos.putNextEntry(zipEntry);
        byte[] bytes = new byte[1024];
        int len;
        while ((len = fileInputStream.read(bytes)) > 0) {
            //读的内容会自动放到zip条目中,因此zipentry再输出流读完需要关闭
            zos.write(bytes, 0, len);
        }
        fileInputStream.close();
        zos.closeEntry();
    }
相关推荐
baiduopenmap1 分钟前
百度世界2024精选公开课:基于地图智能体的导航出行AI应用创新实践
前端·人工智能·百度地图
郑祎亦13 分钟前
Spring Boot 项目 myblog 整理
spring boot·后端·java-ee·maven·mybatis
不是二师兄的八戒13 分钟前
本地 PHP 和 Java 开发环境 Docker 化与配置开机自启
java·docker·php
请叫我欧皇i21 分钟前
html本地离线引入vant和vue2(详细步骤)
开发语言·前端·javascript
躺平的花卷24 分钟前
Python爬虫案例八:抓取597招聘网信息并用xlutils进行excel数据的保存
爬虫·excel
533_24 分钟前
[vue] 深拷贝 lodash cloneDeep
前端·javascript·vue.js
爱编程的小生24 分钟前
Easyexcel(2-文件读取)
java·excel
程序员如山石25 分钟前
Excel的图表使用和导出准备
excel
guokanglun30 分钟前
空间数据存储格式GeoJSON
前端
带多刺的玫瑰41 分钟前
Leecode刷题C语言之统计不是特殊数字的数字数量
java·c语言·算法