栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

java大数据量导出csv文件并压缩

java大数据量导出csv文件并压缩

java大数据量导出csv文件并压缩

java使用POI大数据量导出excel一般会存在以下几个问题:

  • 一次从数据库查询出这么大数据,查询缓慢
  • 查询数据量过大时会内存溢出
    解决方案:分页查询数据,比如一次查询5w数据,生成多个excel文件
  • 大数据量生成excel文件过慢
    解决方案:生成excel改为生成csv文件

本文主要 介绍java 导出csv文件

  • 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> list, String fileName, HttpServletResponse response) throws IOException, IllegalArgumentException, IllegalAccessException{
        StringBuffer expStr = new StringBuffer();
        OutputStream o = null;
        try {
            //csv文件是逗号分隔,除第一个外,每次写入一个单元格数据后需要输入逗号
            for(String title : titles){
                expStr.append(title).append(",");
            }
            //写完文件头后换行
            expStr.append("n");
            //写内容
            for(Map map : list){
                for (String key : map.keySet()) {
                    String val = map.get(key) != null ? map.get(key).toString() : "";
                    expStr.append(val).append(",");
                }
                //写完一行换行
                expStr.append("n");
            }
            response.setContentType("application/download;charset=UTF-8");
            response.setContentType("Content-type:application/vnd.ms-excel;charset=UTF-8");
            response.setHeader("Content-disposition","attachment;filename="+ java.net.URLEncoder.encode(fileName, "UTF-8"));
            o = response.getOutputStream();
            o.write(expStr.toString().getBytes("GBK"));
        } catch (Exception e){
            e.printStackTrace();
        }finally {
            // 关闭
            if(o != null){
                o.close();
            }
        }
    }

    
    public static String exportCsvZip(List titles, List> list, String fileName, HttpServletResponse response) throws IOException, IllegalArgumentException, IllegalAccessException{
        StringBuffer expStr = new StringBuffer();
        ZipOutputStream zos = null;
        OutputStream o = null;
        try {
            //csv文件是逗号分隔,除第一个外,每次写入一个单元格数据后需要输入逗号
            for(String title : titles){
                expStr.append(title).append(",");
            }
            //写完文件头后换行
            expStr.append("n");
            //写内容
            for(Map map : list){
                for (String key : map.keySet()) {
                    String val = map.get(key) != null ? map.get(key).toString() : "";
                    expStr.append(val).append(",");
                }
                //写完一行换行
                expStr.append("n");
            }
            response.setContentType("application/download;charset=UTF-8");
            response.setContentType("Content-type:application/vnd.ms-excel;charset=UTF-8");
            response.setHeader("Content-disposition","attachment;filename=" + java.net.URLEncoder.encode(fileName, "UTF-8"));

            o = response.getOutputStream();
            zos =  new ZipOutputStream(new BufferedOutputStream(o));
            zos.putNextEntry(new ZipEntry(fileName.replace("zip","csv")));//创建压缩文件内的文件
            zos.write(expStr.toString().getBytes("GBK"));
            zos.closeEntry();
        } catch (Exception e){
            e.printStackTrace();
        }finally {
            if(zos != null){
                zos.close();
            }
            if(o != null){
                o.close();
            }
        }
        return "0";
    }
}

  • 调用示例
    @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左右

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/584458.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号