目标:

生成多个csv文件,并打包返回给前端




开干:

1 引入pom

<dependency>
	 	<groupId>cn.hutool</groupId>
     	<artifactId>hutool-all</artifactId>
	     <version>5.8.4</version>
	 </dependency>

2 获取数据,然后生成csv文件

控制器如下:

@PostMapping("/export")
    @ApiOperation("导出")
    public void export(@RequestBody GraphData graphData, HttpServletResponse response, @PathVariable String space) throws UnsupportedEncodingException {
        vertexService.export(graphData,response,space);
    }

主要是通过 response 返回文件流;

通过数据写入到csv中

String fileName = "关系-" + key;
            String pathname = path + "/" + fileName + ".csv";//生成的文件位置 和 文件名称
            CsvWriter csvWriter = CsvUtil.getWriter(new File(pathname), CharsetUtil.CHARSET_UTF_8);//设置编码格式
            for (List<String> row : value) {//数据集合,写入每行数据
                csvWriter.write(Convert.toStrArray(row));
            }
            csvWriter.flush();
            csvWriter.close();
            // 一个文件已经完成,多个文件 循环此代码 多个文件都放在同一个文件夹下

3 通过生成的文件生成压缩包zip

String demoName = "导出数据.zip";
        // 压缩包zip
        String zipPath = path + demoName;//包含zip文件的名称  生成的zip路径 不应该是打包路径的子路径
        ZipUtil.zip(path, zipPath, CharsetUtil.CHARSET_UTF_8, false);
        // path 要压缩的路径
        FileUtil.del(path);// 删除csv源文件  可以不删除

        //返回压缩包
        try {
            BufferedInputStream bis;
            OutputStream out = response.getOutputStream();
            response.setContentType("text/html; charset=UTF-8");//设置编码格式
            response.setContentType("application/octet-stream");// 设置contentype
            response.setHeader("Content-Disposition", "attachment;filename=".concat(
                String.valueOf(URLEncoder.encode(space + "_" + randomNumbers + demoName, CharsetUtil.UTF_8))));
                // 设置返回文件名称
            bis = new BufferedInputStream(new FileInputStream(zipPath));
            //定义byte,长度就是要转成zip文件的byte长度,避免浪费资源
            byte[] buffer = new byte[bis.available()];
            bis.read(buffer);
            out.flush();
            out.write(buffer);
        } catch (IOException e) {
            e.printStackTrace();
        }

最终效果如下

打包文件zip压缩包返回_文件名