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();
    }
相关推荐
Qlly几秒前
全栈工程师怎么接需求?从一句「加个功能」聊到能开发、能验收
前端·后端
马可家的菠萝4 分钟前
你的微信“文件传输助手”,是不是已经成了第二个网盘?
前端·后端·架构
略略略啦5 分钟前
Vibe Coding 基于Spec DD和TDD的实践指南
前端
Allstar_4320 分钟前
制造业研发管理数字化:从 Excel 到专业 APQP 系统的架构选型思考
架构·excel
驾驭人生21 分钟前
NET NPOI 实战:生成带下拉、数据校验、必填标红的 Excel 导入模板
excel
霸道流氓气质23 分钟前
AI智能博客平台实战:RAG增强写作、多Agent协作与语义检索的Vue3 + Spring AI全栈实现
java·人工智能·spring
shmily麻瓜小菜鸡26 分钟前
前端实现图片与PDF文字识别敏感信息打码方案
前端·pdf·状态模式
泡海椒27 分钟前
把 TRANSFORM 做成可扩展能力:JQuick-Excel 的函数与 SPI 调用链
驱动开发·excel
打工仔折腾 AI31 分钟前
LangChain 工具调用实战:从 Tool 定义到 Agent 执行链路拆解
java·前端·人工智能·后端·python·langchain·ai agent 实战
哦虎!32 分钟前
【JavaEE】网络原理 - TCP/IP
java