java海量数据导出xls分页解决报内存溢出问题
来源:互联网 发布:虚拟机安装教程mac 编辑:程序博客网 时间:2024/05/21 22:29
/**
* 写XLS文件
* @param fileName 文件名(全路径)
* @param colTitleList 标题
* @param colPorpertyList 如果属性列 为NULL,则resultData 中的每个元素为一个LIST
* @param resultData 数据
* @throws Exception
*/
public static void writeXLS(HttpServletResponse response,String fileName,List colTitleList,List colPorpertyList,List resultData) throws Exception {
if (resultData == null)
resultData = new ArrayList();
System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"+fileName+" data count="+resultData.size());
int maxCount = 65536;//每页数据最多65536行
boolean bNeedTitle = true;//每页是否要加上标题一行
if (colTitleList == null || colTitleList.size() ==0)
bNeedTitle = false;
HSSFWorkbook workBook = new HSSFWorkbook();
int nDataPerPage = maxCount;//每页数据条数.
if (bNeedTitle)
nDataPerPage = maxCount-1;
//SHEET数
int sheetCount = resultData.size()/nDataPerPage;
if (resultData.size()%nDataPerPage!=0)
sheetCount++;
//如果无数据,则只添加标题行
if (sheetCount == 0){
HSSFSheet sheet = workBook.createSheet("sheet0");
if (bNeedTitle){
HSSFRow row = sheet.createRow(0);
addSheetRow(colTitleList,row);
}
}
OutputStream ouputStream = null;
int rowIndex = 0;//当前数据写到第几行的索引值
for(int i=0;i<sheetCount;i++) {
System.out.println("页码======"+i);
HSSFSheet sheet = workBook.createSheet("sheet"+i);
int dIndex = 0;
//添加标题
if (bNeedTitle){
HSSFRow row = sheet.createRow(dIndex++);
addSheetRow(colTitleList,row);
}
//添加数据
while(dIndex < maxCount) {
//System.out.println("条数"+dIndex);
HSSFRow tempRow = sheet.createRow(dIndex++);//建立新行
List rowDataObj = null;
if (colPorpertyList == null)//如果没有传属性列,则resultData 中的每个元素为一个LIST
rowDataObj = (List)resultData.get(rowIndex++);
else rowDataObj= getRowData(colPorpertyList,resultData.get(rowIndex++));
addSheetRow(rowDataObj,tempRow);
//全部写完了
if (rowIndex == resultData.size())break;
}
}
ouputStream = response.getOutputStream();
//数据流输出
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-disposition", "attachment;filename ="+fileName+".xls");
workBook.write(ouputStream);
ouputStream.flush();
ouputStream.close();
//OutputStream fos = new BufferedOutputStream(new FileOutputStream(new File("D:/down/aa.xls")),1024);
//workBook.write(fos);
//fos.flush();
//fos.close();
* 写XLS文件
* @param fileName 文件名(全路径)
* @param colTitleList 标题
* @param colPorpertyList 如果属性列 为NULL,则resultData 中的每个元素为一个LIST
* @param resultData 数据
* @throws Exception
*/
public static void writeXLS(HttpServletResponse response,String fileName,List colTitleList,List colPorpertyList,List resultData) throws Exception {
if (resultData == null)
resultData = new ArrayList();
System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"+fileName+" data count="+resultData.size());
int maxCount = 65536;//每页数据最多65536行
boolean bNeedTitle = true;//每页是否要加上标题一行
if (colTitleList == null || colTitleList.size() ==0)
bNeedTitle = false;
HSSFWorkbook workBook = new HSSFWorkbook();
int nDataPerPage = maxCount;//每页数据条数.
if (bNeedTitle)
nDataPerPage = maxCount-1;
//SHEET数
int sheetCount = resultData.size()/nDataPerPage;
if (resultData.size()%nDataPerPage!=0)
sheetCount++;
//如果无数据,则只添加标题行
if (sheetCount == 0){
HSSFSheet sheet = workBook.createSheet("sheet0");
if (bNeedTitle){
HSSFRow row = sheet.createRow(0);
addSheetRow(colTitleList,row);
}
}
OutputStream ouputStream = null;
int rowIndex = 0;//当前数据写到第几行的索引值
for(int i=0;i<sheetCount;i++) {
System.out.println("页码======"+i);
HSSFSheet sheet = workBook.createSheet("sheet"+i);
int dIndex = 0;
//添加标题
if (bNeedTitle){
HSSFRow row = sheet.createRow(dIndex++);
addSheetRow(colTitleList,row);
}
//添加数据
while(dIndex < maxCount) {
//System.out.println("条数"+dIndex);
HSSFRow tempRow = sheet.createRow(dIndex++);//建立新行
List rowDataObj = null;
if (colPorpertyList == null)//如果没有传属性列,则resultData 中的每个元素为一个LIST
rowDataObj = (List)resultData.get(rowIndex++);
else rowDataObj= getRowData(colPorpertyList,resultData.get(rowIndex++));
addSheetRow(rowDataObj,tempRow);
//全部写完了
if (rowIndex == resultData.size())break;
}
}
ouputStream = response.getOutputStream();
//数据流输出
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-disposition", "attachment;filename ="+fileName+".xls");
workBook.write(ouputStream);
ouputStream.flush();
ouputStream.close();
//OutputStream fos = new BufferedOutputStream(new FileOutputStream(new File("D:/down/aa.xls")),1024);
//workBook.write(fos);
//fos.flush();
//fos.close();
}
/**
* 添加标题
* @param colTitleList
* @param row
*/
private static void addSheetRow(List rowDataList,HSSFRow row){
if (rowDataList == null || rowDataList.size() == 0)return;
Iterator tIter = rowDataList.iterator();
int index = 0;
while (tIter.hasNext()) {
HSSFCell cell = row.createCell((short)index++);
//cell.setEncoding(HSSFCell.ENCODING_UTF_16);
cell.setCellValue(String.valueOf(tIter.next()));
}
}
经测试 下载一百多万的数据 查询要一分半 导出要三分钟左右,不会报内存溢出 但是数据量太大 xls 文件无法打开 推荐把文件分开放入zip中。
1 0
- java海量数据导出xls分页解决报内存溢出问题
- 海量数据导出解决内存溢出问题csv txt格式
- Java Web 解决POI导入大批量Excel2007数据报内存溢出问题
- 解决Eclipse报内存溢出问题
- POI实现大数据EXCLE导入导出,解决内存溢出问题
- JAVA解决大批量导出数据到excel产生内存溢出的方案
- 解决大批量数据导出Excel产生内存溢出的方案
- 解决大批量数据导出Excel产生内存溢出的方案
- 解决大批量数据导出Excel产生内存溢出的方案
- 解决大批量数据导出Excel产生内存溢出的方案
- 解决大批量数据导出Excel产生内存溢出的方案
- 解决大批量数据导出Excel产生内存溢出的方案
- 解决大批量数据导出Excel产生内存溢出的方案
- 解决POI大数据导出Excel内存溢出、应用假死
- 解决内存溢出问题:java.lang.OutOfMemoryError
- linux解决java内存溢出问题总结
- 解决POI导出Excel文件内存溢出问题
- 内存溢出报错解决
- 超实用压力测试工具-ab工具
- STM32中控制I/O口的寄存器们
- 代码的自动生成与编译(一)
- Apache ActiveMQ启动DEMO错误
- 【C语言】文件指针与文件位置指针,位置指针相关操作库函数
- java海量数据导出xls分页解决报内存溢出问题
- 如何在SQL Server实现类似RowNum伪列
- iOS支付宝集成详细流程
- HDU 1011 Starship Troopers 树形背包
- 红黑树删除
- 使用ProguardGUI.jar 混淆Jar包
- Android CircleImageView圆形ImageView
- MySql 索引
- OC中的KVC和KVO