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();
    }
相关推荐
无限大.4 分钟前
c语言200例 067
java·c语言·开发语言
余炜yw5 分钟前
【Java序列化器】Java 中常用序列化器的探索与实践
java·开发语言
攸攸太上6 分钟前
JMeter学习
java·后端·学习·jmeter·微服务
Kenny.志9 分钟前
2、Spring Boot 3.x 集成 Feign
java·spring boot·后端
惜.己11 分钟前
javaScript基础(8个案例+代码+效果图)
开发语言·前端·javascript·vscode·css3·html5
不修×蝙蝠11 分钟前
八大排序--01冒泡排序
java
sky丶Mamba26 分钟前
Spring Boot中获取application.yml中属性的几种方式
java·spring boot·后端
什么鬼昵称34 分钟前
Pikachu-csrf-CSRF(get)
前端·csrf
数据龙傲天1 小时前
1688商品API接口:电商数据自动化的新引擎
java·大数据·sql·mysql
长天一色1 小时前
【ECMAScript 从入门到进阶教程】第三部分:高级主题(高级函数与范式,元编程,正则表达式,性能优化)
服务器·开发语言·前端·javascript·性能优化·ecmascript