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 ...
随机推荐
- Python浮点型数据小数点的取舍
python默认的是17位小数的精度 1.round()内置方法 π=3.1415926535 new_num=round(π,2) #四舍五入保留两位小数 print(new_num) ...
- JavaScript基础入门06
目录 JavaScript 基础入门06 Math 对象 Math对象的静态属性 Math对象的静态方法 指定范围的随机数 返回随机字符 三角函数 Date对象 基础知识 日期对象具体API 构造函数 ...
- Day02:基本IO操作
IO流 基本IO与OS 按照流的方向主要分为输入流和输出流. 数据流按照数据单位的不同分为字节流和字符流. 按照功能可以划分节点流和处理流. 节点流与处理流 按照流是否直接与特定的地方(如磁盘.内存. ...
- XCTF (app1)
打开app.一个文本框,随便输入提示如下图. 打开JEB反编译. v2调用getPackageInfo获取版本信息.一般 Android 通过 PackageInfo 这个类来获取应用安装包信息,比如 ...
- API接口设计的五大公共参数
1.平台参数 2.操作系统参数 iOS.Android.PC等等 3.软件版本参数 4.udid号(设备唯一ID) 每个设备都会有一个唯一udid 5.渠道号 app软件从那个渠道下载
- 搭建本地parcel仓库
参考:https://www.cloudera.com/documentation/enterprise/6/6.2/topics/cm_ig_create_local_parcel_repo.htm ...
- Elasticsearch集群基本操作
检查集群的命令 $ curl http://172.16.101.55:9200/_cat =^.^= /_cat/allocation /_cat/shards /_cat/shards/{inde ...
- 编写java 程序与Linux进行远程连接并运行linux下的脚本
我这里是通过连接到centos6.5的大数据集群的主节点,并通过运行hadoop的启动脚本来启动hadoop 本人采用的是SSH的方式连接 通过创建maven项目来编写代码,在编写代码之前需要先导入架 ...
- java 兔子生仔问题
题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少? 程序分析: 兔子的规律为数列1,1,2,3,5,8 ...
- Hadoop系列读书笔记
<Hadoop应用架构>是Orilley旗下精品系列的图书 Hadoop序列化 Thrift 不支持内部压缩 不能分片 缺少MapReduce的原生支持 Protocol Buffers ...