poi导出excel数据量过大
问题:使用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数据量过大的更多相关文章
- PHP 导出excel 数据量大时
public function ceshiexcel1(){ set_time_limit(0); $filename = '病毒日志'; header('Content-Type: applicat ...
- excel 数据量较大边查询边输入到excel表格中
public Resultmodel getexpenseMessagx(HttpServletResponse response, String date1, String date2) { lon ...
- Java之POI导出Excel(二):多个sheet
相信在大部分的web项目中都会有导出导入Excel的需求,之前我也写过一篇导出单个sheet工作表的文章,没看过的小伙伴可以去看哈,链接也给大家放出来了:导出单个sheet 但是在我们日常的工作中,需 ...
- 使用POI导出EXCEL工具类并解决导出数据量大的问题
POI导出工具类 工作中常常会遇到一些图表需要导出的功能,在这里自己写了一个工具类方便以后使用(使用POI实现). 项目依赖 <dependency> <groupId>org ...
- 使用NPOI或POI 导出Excel大数据(百万级以上),导致内存溢出的解决方案(NPOI,POI)
使用工具:POI(JAVA),NPOI(.Net) 致谢博主 Crazy_Jeff 提供的思路 一.问题描述: 导出任务数据量近100W甚至更多,导出的项目就会内存溢出,挂掉. 二.原因分析: 1.每 ...
- 系统导出数据到excel,数据量过大(大约10W)条,导致服务器 cpu 100%解决方法
系统导出数据到excel,数据量过大(大约10W)条,导致服务器 cpu 100%解决方法
- POI导出大量数据的简单解决方案(附源码)-Java-POI导出大量数据,导出Excel文件,压缩ZIP(转载自iteye.com)
说明:我的电脑 2.0CPU 2G内存 能够十秒钟导出 20W 条数据 ,12.8M的excel内容压缩后2.68M 我们知道在POI导出Excel时,数据量大了,很容易导致内存溢出.由于Excel ...
- java中使用poi导出excel表格数据并且可以手动修改导出路径
在我们开发项目中,很多时候会提出这样的需求:将前端的某某数据以excel表格导出,今天就给大家写一个简单的模板. 这里我们选择使用poi导出excel: 第一步:导入需要的jar包到 lib 文件夹下
- PHPExcel导出数据量过大处理
今天使用PHPExce插件导不出数据,发现是数据量过大的原因,这里只做简单的处理. 1.导出超时处理:在执行页面添加:set_time_limit(0); 2.内存溢出:在执行页面添加:ini_set ...
随机推荐
- 如何让JavaScript元素运动起来 ?
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- springboot和springcloud版本冲突问题
最近搭建eureka项目,出现boot和cloud版本不匹配错误,记录下来 2019-12-06 14:00:20.043 ERROR 180780 --- [ main] o.s.boot.Spri ...
- FTP简单搭建(一)
一.FTP服务介绍 vsftp(very security ftp file transfer protocol 非常文件传输协议) FTP分为主动模式和被动模式. 主动模式:(不安全,传数据的端口是 ...
- IIS配置相关问题:Framework 4.5 在IIS 7.5中运行
<system.webServer> <validation validateIntegratedModeConfiguration="false" /&g ...
- ElasticSearch - activemq - tomcat 开机自启动
[root@qwy ~]# cat /etc/init.d/elastisearch|grep -v '^#' export JAVA_HOME=/usr/local/java/jdk1..0_172 ...
- ucloud相关
ucloud申请证书 https://docs.ucloud.cn/domain/ussl/operate/buy 云主机: https://docs.ucloud.cn/compute/uhost/ ...
- 吉首大学2019年程序设计竞赛(重现赛)-J(树形DP)
题目链接:https://ac.nowcoder.com/acm/contest/992/J 题意:题意很清晰,就是求任意两点距离的和,结果对1e9+7取模. 思路:裸的树形DP题,一条边的贡献值=这 ...
- t-sql最短路径搜索
SET STATISTICS IO ON; SET STATISTICS TIME ON; GO IF OBJECT_ID(N'dbo.t1') IS NOT NULL DROP TABLE dbo. ...
- Java基础(五)
方法概述 方法的定义格式 什么是方法?方法就好像是一个工厂. 如奶牛场 原料:奶牛,饲料 产出物:牛奶,各种奶制品 程序当中的方法 参数(原料):进入方法的数据 返回值(产出物):从方法中出来的数据 ...
- Tomcat解析XML和反射创建对象原理
Tomcat解析XML和反射创建对象原理 import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Me ...