目标:
生成多个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();
}
最终效果如下