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 ...
随机推荐
- k8s报错解决
. Jul :: lab3 etcd[]: the server is already initialized as member before, starting as etcd member... ...
- three中的着色器示例
其实在3D引擎/库的帮助下,我们做webgl开发的难度已经很大大地降低了,熟悉相关API的话,开发一个简单的3D程序可以说是很轻松的事情. 在我看来,webgl的核心就是着色器(顶点着色器.片元着色器 ...
- 参考:菜菜的sklearn教学之降维算法.pdf!!
PCA(主成分分析法) 1. PCA(最大化方差定义或者最小化投影误差定义)是一种无监督算法,也就是我们不需要标签也能对数据做降维,这就使得其应用范围更加广泛了.那么PCA的核心思想是什么呢? 例如D ...
- 不可不知的JavaScript - 闭包函数
闭包函数 什么是闭包函数? 闭包函数是一种函数的使用方式,最常见的如下: function fn1(){ function fn(){ } return fn; } 这种函数的嵌套方式就是闭包函数,这 ...
- JavaScript基础入门09
目录 JavaScript 基础入门09 Event 自定义右键菜单 获取鼠标按键 获取鼠标坐标 获取键盘按键 页面中位置的获取 浏览器的默认行为 冒泡 什么是冒泡 小练习 JavaScript 基础 ...
- 【AMAD】django-filer -- 一个管理文件和图片的django app
动机 简介 个人评分 动机 django-filer1可以让你像一些云存储一样使用WEB UI控制你的文件. 简介 下面是前端图片:   个人评分 类型 评分 实用性 ⭐️⭐️⭐️⭐️ 易用性 ⭐ ...
- 小米手机Toast带app名称
如果用小米手机做测试,会发现,Toast弹窗有可能会在前面带app名称.这是因为你传入的context是activity,如果是Application的话,就不会显示app名称.但是,我做测试时,一般 ...
- flink部署
参考: https://ververica.cn/developers-resources/ #flink参数 https://blog.csdn.net/qq_35440040/article/de ...
- ADG环境搭建
一:实验环境介绍PC机系统: CentOS 6.5(64位)数据库版本: Oracle 11gR2 11.2.0.4 (64位)IP地址规划:主数据库10.110.9.41 SID:orapridb_ ...
- 在Docker中部署ASP.NET Core 2.2
⒈新建一个ASP.NET Core2.2 Web程序 因为Windows的Docker和Linux的Docker有所不同,本次测试采用的是Linux的Docker,因此没有勾选启用Docker支持. ...