java大数据量导出csv文件并压缩
java使用POI大数据量导出excel一般会存在以下几个问题:
- 一次从数据库查询出这么大数据,查询缓慢
- 查询数据量过大时会内存溢出
解决方案:分页查询数据,比如一次查询5w数据,生成多个excel文件 - 大数据量生成excel文件过慢
解决方案:生成excel改为生成csv文件
本文主要 介绍java 导出csv文件
package com.yss.datamiddle.util;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.lang.reflect.Field;
import java.util.List;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class CsvUtils {
public static void exportCsv(List titles, List
@ApiOperation(value="导出csv文件")
@PostMapping("/v1/exportCsv")
public void exportCsv(HttpServletResponse response) throws IOException, IllegalAccessException {
//模拟获取测试数据
List> datas = getDatas();
// 导出文件列头
List titles = Arrays.asList("第一列title", "第二列title", "第三列title", "第四列title", "第五列title");
// 导出csv文件
CsvUtils.exportCsv(titles,datas,"test.csv",response);
// 导出csv压缩文件
CsvUtils.exportCsvZip(titles,datas,"test.zip",response);
}
public List> getDatas(){
List> datas = new ArrayList<>();
for (int i = 0; i < 10000; i++){
Map map = new HashMap<>();
map.put("a1","a1"+i);
map.put("b2","b2"+i);
map.put("c3","c3"+i);
map.put("d4","d4"+i);
map.put("e5","e5"+i);
datas.add(map);
}
return datas;
}
亲测导出40w数据到csv耗时3s左右