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();
    }
相关推荐
追风林3 分钟前
mac m1 docker本地部署canal 监听mysql的binglog日志
java·docker·mac
ruleslol16 分钟前
VBA02-初识宏——EXCEL录像机
excel·vba
IT铺子16 分钟前
制定Excel使用规范和指导,提升数据处理的效率和准确性,减少错误和数据丢失的风险
excel
芒果披萨17 分钟前
El表达式和JSTL
java·el
是萝卜干呀19 分钟前
Backend - Python 爬取网页数据并保存在Excel文件中
python·excel·table·xlwt·爬取网页数据
吕彬-前端33 分钟前
使用vite+react+ts+Ant Design开发后台管理项目(五)
前端·javascript·react.js
学前端的小朱36 分钟前
Redux的简介及其在React中的应用
前端·javascript·react.js·redux·store
guai_guai_guai1 小时前
uniapp
前端·javascript·vue.js·uni-app
duration~1 小时前
Maven随笔
java·maven
zmgst1 小时前
canal1.1.7使用canal-adapter进行mysql同步数据
java·数据库·mysql