博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java封装导出excel之——优化
阅读量:4263 次
发布时间:2019-05-26

本文共 5165 字,大约阅读时间需要 17 分钟。

      上次,我们说道了如何使用HSSFWorkbook(POI)实现导出excel的功能。而且我们也已经实现了。但是,我们发现,当我们导出几万设置几十万的数据时,就会很慢,而且还会造成内存溢出的问题。如果经常下载大量数据,还会占用服务器上的存储空间。今天,我们来优化一下我们的导出excel。

1、生成多个excel文件

      当数据量比较大时,我们选择让每个excel分为多个sheet,并且生成多个excel,然后将多个excel压缩,最后输出。

/**     * 导出Excel     * @param excelName   要导出的excel名称     * @param list   要导出的数据集合     * @param fieldMap 中英文字段对应Map,即要导出的excel表头     * @param response  使用response可以导出到浏览器     * @return     */     public static 
void export(String excelName,List
list,LinkedHashMap
fieldMap,HttpServletResponse response){ // 设置默认文件名为当前时间:年月日时分秒 if (excelName==null || excelName=="") { excelName = new SimpleDateFormat("yyyyMMddhhmmss").format( new Date()).toString(); } int total=list.size(); //总记录数 int excelBig=10000; //excel划分的大小 //判断需要分成多少个excel int excelCount=(total%excelBig==0)?(total/excelBig):(total/excelBig+1); //定义一个excel集合 List
excelList=new ArrayList
(); HSSFWorkbook wb=null; //excel工作表 int begin = 0; //数据源的开始位置 int end = 0; //数据源的结束位置 //循环得到excel集合 for(int i=0;i
list.size()){ end=list.size(); } //生成excel wb=createExcel(excelName+(i+1), list,begin,end, fieldMap, response); //将生成的excel添加到集合 excelList.add(wb); } //生成压缩文件,并导出 toZipOut(excelName, excelList, response); }

2、每个excel生成多个sheet

/**     * 生成Excel     * @param excelName   要导出的excel名称     * @param list       要导出的数据集合     * @param begin   数据集合的开始位置     * @param end      数据集合的结束位置     * @param fieldMap 中英文字段对应Map,即要导出的excel表头     * @param response  使用response可以导出到浏览器     * @return     */     private static 
HSSFWorkbook createExcel(String excelName,List
list,Integer begin,Integer end, LinkedHashMap
fieldMap,HttpServletResponse response){ int sheetContent=2000; //每个excel中sheet的容量 //计算sheet的数量 int sheetCount=0; //如果总记录数 正好整除 以每个sheet的容量 if ((end-begin)%sheetContent==0){ //sheet的数量=总记录数 除以 每个sheet的容量 sheetCount=(end-begin)/sheetContent; }else{ //sheet的数量=总记录数 除以 每个sheet的容量 加1 sheetCount=(end-begin)/sheetContent+1; } //创建一个WorkBook,对应一个Excel文件 HSSFWorkbook wb=new HSSFWorkbook(); //创建单元格,并设置值表头 设置表头居中 HSSFCellStyle style=wb.createCellStyle(); //创建一个居中格式 style.setAlignment(HSSFCellStyle.ALIGN_CENTER); //定义sheet HSSFSheet sheet=null; //定义sheet的名称 String sheetName=excelName+"-"; //sheet中的数据开始位置 int beginSheet=0; //sheet中的数据结束位置 int endSheet=0; //循环创建sheet for (int i=0;i
end){ endSheet=end; } // 填充工作表 try { fillSheet(sheet,list,beginSheet,endSheet,fieldMap,style); } catch (Exception e) { logger.info(e.getMessage()); } } //返回excel return wb; }

3、将文件压缩为zip格式

/**     * 生成压缩文件,并导出     * @param excelName   要导出的excel名称     * @param excelList   要压缩的文件集合     * @param response  使用response可以导出到浏览器     * @return     */         private static 
void toZipOut(String excelName,List
excelList,HttpServletResponse response){ try { //将压缩包的名字默认为日期时间串 String fieldName=new SimpleDateFormat("yyyyMMddhhmmss").format( new Date()).toString(); /**设置response头信息**/ //重置response头信息 response.reset(); //自己写状态码 response.setStatus(HttpServletResponse.SC_OK); //使客户端浏览器,区分不同种类的数据,并根据不同的MIME调用浏览器内不同的程序嵌入模块来处理相应的数据。 //ZIP与EXE文件的MIME类型同为application/octet-stream response.setContentType( "application/octet-stream "); //Content-disposition 是 MIME 协议的扩展,MIME 协议指示 MIME 用户代理如何显示附加的文件。 //Content-disposition其实可以控制用户请求所得的内容存为一个文件的时候提供一个默认的文件名,文件直接在浏览器上显示或者在访问时弹出文件下载对话框。 //此处设置下载文件的格式为.zip response.setHeader("Content-Disposition","attachment;filename=\""+fieldName+".zip"+"\""); //生成输出流 OutputStream ouputStream = response.getOutputStream(); //生成压缩包 ZipOutputStream zip = new ZipOutputStream(ouputStream); zip.setEncoding("GBK");//指定编码为gbk,否则部署到linux下会出现乱码 int i = 1; String eName; //循环文件列表,添加到压缩包中 for(HSSFWorkbook workbook:excelList){ //给每个文件名加序号 eName=excelName+String.valueOf(i); //实例化一个压缩实体 ZipEntry entry = new ZipEntry(eName+".xls"); //将压缩实体放入压缩包 zip.putNextEntry(entry); //将excel内容写进压缩实体 workbook.write(zip); i++; } //将文件输出 zip.flush(); zip.close(); response.flushBuffer(); } catch (Exception e) { logger.info("导出Excel失败!"); logger.error(e.getMessage()); } }

总结:

      这里我们只是将大数据进行了切割,转而变成处理小数据,这只是做了一部分的优化处理,希望大家能有更好的优化方法。

转载地址:http://nymei.baihongyu.com/

你可能感兴趣的文章
详解slab机制(1) slab是什么
查看>>
详解slab机制(2) 创建slab的过程
查看>>
详解slab机制(3) slab分配机制
查看>>
详解slab机制(4) slab初始化
查看>>
linux arm的高端内存映射(1) vmalloc
查看>>
linux arm的高端内存映射(2) 永久映射和临时映射
查看>>
39岁研究生毕业14年的经验和教训
查看>>
linux进程地址空间(1) fork/clone/vfork详解(1)
查看>>
linux进程地址空间(1) fork/clone/vfork详解(2)
查看>>
linux进程地址空间(2) 缺页异常详解(1)原理和内核缺页异常处理
查看>>
linux进程地址空间(2) 缺页异常详解(2)请求调页详解
查看>>
linux进程地址空间(2) 缺页异常详解(3)写时复制COW详解
查看>>
linux进程地址空间(3) 内存映射(1)mmap与do_mmap
查看>>
linux进程地址空间(3) 内存映射(2)malloc与do_brk
查看>>
linux学习方法的不断感悟
查看>>
TCP/IP网络层(转)
查看>>
uart串口驱动
查看>>
SPI详解及SPI接口flash举例
查看>>
I2C设备驱动详述
查看>>
netlink详解--以本人项目为实例
查看>>