问题:使用poi导出excel,数据量过大导致内存溢出

解决思路:1、多sheet导出

     2、生成多个excel打包下载

     3、生成csv下载

本文使用的是第二个思路,代码如下:

poiUtil工具类

package com.rratchet.scala.ms.util;

import org.apache.poi.hssf.usermodel.*;
import javax.servlet.http.HttpServletResponse;
import java.io.*; import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; /**
* poi 公用方法
*/
public class PoiUtil { /**
* 导出excel
* @param sheetName
* @param title
* @param values
* @param response
* @param fileName
* @param charsetName
*/
public static void exportExcel(String sheetName, String []title, String [][]values, HttpServletResponse response, String fileName,String charsetName){ // 第一步,创建一个HSSFWorkbook,对应一个Excel文件
HSSFWorkbook wb= new HSSFWorkbook();
createContent( wb,sheetName,title,values);
//响应到客户端
try {
fileName = new String(fileName.getBytes(charsetName),"ISO8859-1");
response.setContentType("application/octet-stream;charset="+charsetName);
response.setHeader("Content-Disposition", "attachment;filename="+ fileName);
response.addHeader("Pargam", "no-cache");
response.addHeader("Cache-Control", "no-cache");
OutputStream os = response.getOutputStream();
wb.write(os);
os.flush();
os.close();
} catch (Exception e) {
e.printStackTrace();
} } /**
* 创建excel
* @param sheetName sheet名
* @param title 标题
* @param values 内容
* @param fileName 文件名
* @param filePath 文件地址
* @return excel保存路径
* @throws Exception
*/
public static String createExcel(String sheetName, String []title, String [][]values,String fileName,String filePath){
String resultPath=filePath+"/"+fileName;
// 第一步,创建一个HSSFWorkbook,对应一个Excel文件
HSSFWorkbook wb= new HSSFWorkbook();
createContent( wb,sheetName,title,values);
//判断是否存在目录. 不存在则创建
isChartPathExist(filePath);
//创建Excel文件
isFileExist(filePath+"/"+fileName);
try{
FileOutputStream output=new FileOutputStream(filePath+"/"+fileName);
wb.write(output);//写入磁盘
output.close();
}catch (Exception e){
resultPath="";
e.printStackTrace();
}
return resultPath;
} /**
* 创建excel内容
* @param wb
* @param sheetName
* @param title
* @param values
*/
private static void createContent(HSSFWorkbook wb, String sheetName, String []title, String [][]values){
// 第二步,在workbook中添加一个sheet,对应Excel文件中的sheet
HSSFSheet sheet = wb.createSheet(sheetName);
// 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制
HSSFRow row = sheet.createRow(0);
// 第四步,创建单元格,并设置值表头 设置表头居中
HSSFCellStyle style = wb.createCellStyle();
// 创建一个居中格式
style.setAlignment(HorizontalAlignment.CENTER);
//声明列对象
HSSFCell cell = null;
//创建标题
for(int i=0;i<title.length;i++){
cell = row.createCell(i);
cell.setCellValue(title[i]);
cell.setCellStyle(style);
} //创建内容
for(int i=0;i<values.length;i++){
row = sheet.createRow(i + 1);
for(int j=0;j<values[i].length;j++){
//将内容按顺序赋给对应的列对象
row.createCell(j).setCellValue(values[i][j]);
}
}
} /**
* 判断文件夹是否存在,如果不存在则新建
*
* @param dirPath 文件夹路径
*/
private static void isChartPathExist(String dirPath) {
File file = new File(dirPath);
if (!file.exists()) {
file.mkdirs();
}
} /**
* 判断文件是否存在,不存在则创建文件
* @param dirPath
*/
public static void isFileExist(String dirPath){
File file = new File(dirPath);
if (!file.exists()) {
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
} }

fileUtil工具类

    /**
* 压缩文件(zip)
* @param srcFiles
* @param zippath
* @throws Exception
*/
public static void Zip(List<File> srcFiles , String zippath)throws Exception {
File file=new File(zippath);
if(!file.exists()){
file.createNewFile();
}
FileOutputStream out = new FileOutputStream(file);
long start = System.currentTimeMillis();
ZipOutputStream zos = null ;
try {
zos = new ZipOutputStream(out);
for (File srcFile : srcFiles) {
byte[] buf = new byte[4096 * 1024];
zos.putNextEntry(new ZipEntry(srcFile.getName()));
int len;
FileInputStream in = new FileInputStream(srcFile);
while ((len = in.read(buf)) != -1){
zos.write(buf, 0, len);
}
zos.closeEntry();
in.close();
}
long end = System.currentTimeMillis();
System.out.println("压缩完成,耗时:" + (end - start) +" ms");
} catch (Exception e) {
throw new RuntimeException("zip error from ZipUtils",e);
}finally{
if(zos != null){
try {
zos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
} /**
*获取路径下所有文件(递归遍历)
* @param fileList
* @param path
* @throws Exception
*/
public static void getFiles(List<File>fileList, String path){
try {
File file = new File(path);
if(file.isDirectory()){
File []files = file.listFiles();
for(File fileIndex:files){
//如果这个文件是目录,则进行递归搜索
if(fileIndex.isDirectory()){
getFiles(fileList,fileIndex.getPath());
}else {
//如果文件是普通文件,则将文件句柄放入集合中
fileList.add(fileIndex);
}
}
}
}catch (Exception e){
e.printStackTrace();
}
}

测试方法

    public static void main(String[] args) throws IOException {
String filePath="D:/home/"+UUID.randomUUID().toString();
String[] titles = {"上传时间", "连接时间"};
for(int i=0;i<5;i++){
String time = DateUtil.getDateyyyymmddFormat(new Date());
//excel文件名
String fileName = "连接记录_" + i + ".xls";
//sheet名
String sheetName = time;
String[][] content = new String[20][2];
for (int j = 0; j < 20; j++) {
content[j][0] = "20190-05-29"+"_"+j;
content[j][1] = "s"+j; }
PoiUtil.createExcel(sheetName,titles, content, fileName, filePath);
}
List<File> list=new ArrayList<>();
//递归获取文件夹下所有内容
FileUtils.getFiles(list,filePath);
try {
FileUtils.Zip(list,"D:/home/测试.zip");
//删除生成的excel
FileUtils.deleteFolderAndFile(filePath);
} catch (Exception e) {
e.printStackTrace();
} }
												

poi导出excel数据量过大的更多相关文章

  1. PHP 导出excel 数据量大时

    public function ceshiexcel1(){ set_time_limit(0); $filename = '病毒日志'; header('Content-Type: applicat ...

  2. excel 数据量较大边查询边输入到excel表格中

    public Resultmodel getexpenseMessagx(HttpServletResponse response, String date1, String date2) { lon ...

  3. Java之POI导出Excel(二):多个sheet

    相信在大部分的web项目中都会有导出导入Excel的需求,之前我也写过一篇导出单个sheet工作表的文章,没看过的小伙伴可以去看哈,链接也给大家放出来了:导出单个sheet 但是在我们日常的工作中,需 ...

  4. 使用POI导出EXCEL工具类并解决导出数据量大的问题

    POI导出工具类 工作中常常会遇到一些图表需要导出的功能,在这里自己写了一个工具类方便以后使用(使用POI实现). 项目依赖 <dependency> <groupId>org ...

  5. 使用NPOI或POI 导出Excel大数据(百万级以上),导致内存溢出的解决方案(NPOI,POI)

    使用工具:POI(JAVA),NPOI(.Net) 致谢博主 Crazy_Jeff 提供的思路 一.问题描述: 导出任务数据量近100W甚至更多,导出的项目就会内存溢出,挂掉. 二.原因分析: 1.每 ...

  6. 系统导出数据到excel,数据量过大(大约10W)条,导致服务器 cpu 100%解决方法

    系统导出数据到excel,数据量过大(大约10W)条,导致服务器 cpu 100%解决方法

  7. POI导出大量数据的简单解决方案(附源码)-Java-POI导出大量数据,导出Excel文件,压缩ZIP(转载自iteye.com)

    说明:我的电脑 2.0CPU 2G内存 能够十秒钟导出 20W 条数据 ,12.8M的excel内容压缩后2.68M 我们知道在POI导出Excel时,数据量大了,很容易导致内存溢出.由于Excel ...

  8. java中使用poi导出excel表格数据并且可以手动修改导出路径

    在我们开发项目中,很多时候会提出这样的需求:将前端的某某数据以excel表格导出,今天就给大家写一个简单的模板. 这里我们选择使用poi导出excel: 第一步:导入需要的jar包到 lib 文件夹下

  9. PHPExcel导出数据量过大处理

    今天使用PHPExce插件导不出数据,发现是数据量过大的原因,这里只做简单的处理. 1.导出超时处理:在执行页面添加:set_time_limit(0); 2.内存溢出:在执行页面添加:ini_set ...

随机推荐

  1. iOS UItextView监听输入特定字符跳转页面选择选项返回

    今天有朋友问我一个需求的实现,于是自己写了一个Demo简单的实现了一下: 需求是: 1>比如: 检测用户输入"A"字符串,跳转页面选择选项,将选择的选项放置textView里 ...

  2. 使用shell脚本常见的一些问题

    Jdk版本:jdk-8u102-linux-x64 Tomcat版本:apache-tomcat-7.0.92 Redis版本:redis-5.0.0 由于公司项目的需要,要在多台服务器上面部署一些应 ...

  3. 【ABAP系列】【第六篇】SAP ABAP7.50 之隐式增强

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列][第六篇]SAP ABAP7.5 ...

  4. PI膜概述

    一.概述 1.简述 聚酞亚胺薄膜又称PI薄膜(polyimide filin)是一种含有酞亚胺或丁二酞亚胺的绝缘类高分子材料.是目前工程塑料中耐热性最好的品种之一. 2.发展简史 1908年,PI聚合 ...

  5. C++学习笔记-const

    const在C++中有着大量的运用,深刻理解const有助于进一步理解C++. const基础知识 int main() { const int a;//C++中必须初始化 int const b;/ ...

  6. 好用的 Chrome 插件

    这些好用的 Chrome 插件,提升你的工作效率   本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可 ...

  7. 图解DMZ

    图解DMZ 1. 概念介绍 DMZ是英文“demilitarized zone”的缩写,中文译为“隔离区”.“非军事区”.它是为了解决安装防火墙后外部网络不能访问内部网络服务器的问题,而设立的一个非安 ...

  8. [转帖]docker清理日志

    docker清理日志 2017年05月03日 10:37:27 不想当码农的程序员 阅读数 12827    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn. ...

  9. [转帖]忘记了MariaDB root密码的解决办法

    忘记了MariaDB root密码的解决办法 https://www.cnblogs.com/liaojie970/p/6126322.html 貌似跟 mysql 是一样的. 1.停掉mariaDB ...

  10. 解决ubuntu命令行中文乱码

    解决方法: 1.安装zhcon 登入用户后,输入 1 sudo apt-get install zhcon 2.启动zhcon 输入 1 zhcon --utf8  PS:zhcon支持中文输入法,按 ...