如何使用Apache的HSSF(POI)来写上万行的Excel报表

smilejason 2005-09-23 08:20:46
最近在做一个移动电信的数据集市项目,使用的是teradata数据仓库。由于teradata数据仓库不支持从符合查询条件的记录中取子集合,即从第n条开始到第m的记录集,所以一次查询只能取得所有的记录。这样就使得结果集很大,有上万条的记录。如果一次循环写这么多记录本会报内存溢出异常(如果写两三千条则不会有错)。
我的实现代码如下:
/**
* 写入导出消费情况统计累计的Excel文件的内容
*
* @param String ss_excelFileName 所写的Excel文件名(包括绝对目录)
* @param ArrayList consumeStatList 写入Excel文件的工作日志记录列表
* @param iSheet 工作表
* @param short rowOffset 把消费情况统计累计写入Excel文件时的开始行号(从第几行开始写)
* @param short colsOffset 把消费情况统计累计写入Excel文件时的开始列号(从第几列开始写)
* @param cols 总的列数(共写几列)
*
* return HSSFWorkbook 工作簿
*/
public synchronized HSSFWorkbook writeReportByStatExcel(String ss_excelFileName,ArrayList consumeStatList,
short iSheet,short rowOffset, short colsOffset, short cols) throws Exception{

HSSFWorkbook wb = null;
HSSFCell headerCell = null;
HSSFRow headerRow = null;
short k;
int li_workLogAmount = 0;
try{
POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(ss_excelFileName));
wb = new HSSFWorkbook(fs);

HSSFSheet sheet = wb.getSheetAt( iSheet );
HSSFRow row = null;
HSSFCell cell = null;

short rows = (short)consumeStatList.size();
// Enumerator是自定义一个集合包装类
Enumerator enum = new Enumerator( consumeStatList );
int i = 0;
while( enum.hasMoreElements() ){
ConsumeStatVO consumeStat = (ConsumeStatVO)enum.nextElement();
row = sheet.getRow(rowOffset+i);
if (row != null) {
sheet.removeRow(row);
}
for(short j=0; j<cols; j++) {
k = (short)(colsOffset + j);
cell = row.getCell(k);
cell.setEncoding(HSSFCell.ENCODING_UTF_16);
switch (k){
case 0:
cell.setCellValue(consumeStat.getServiceNo());
break;

case 1:
cell.setCellValue(consumeStat.getCountyCode());
break;
case 2:
cell.setCellValue(consumeStat.getVipClass()); break;
case 3:
cell.setCellValue(consumeStat.getFeeCharge()); break;

case 4:
cell.setCellValue(consumeStat.getPackageId());
break;
case 5:
cell.setCellValue(consumeStat.getManagerId()); break;
}// end switch(k)
} // end for(j)
i++;
}// while()
}
catch(Exception e){
System.out.println("My Exception: Class: ConsumeStatisticPOI, " +
"method writeReportByStatExcel()" + e.getMessage());
}finally{
consumeStatList.clear();
}
return wb;
}
...全文
195 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
pdw2009 2006-01-03
  • 打赏
  • 举报
回复
你可以考虑用csv类型来生成一个excel 文件..

StringBuffer sb=new StringBuffer();
sb.append ("fasdf").append("\n"); //换行
sb.append("fasdf").append("\t") ; //跳到下一个单元格,

然后在servlet输出该文件,当然你得要在contentType("application/excel.....")这忘记了,就是把它当作一个excel文件来输出.

我在一个联通的项目里就是这样实现的.速度非常好....
musachao 2005-12-30
  • 打赏
  • 举报
回复
Excel到底能不能输出上十万行数据,分sheet也行,真的就没办法么?

########################等待高手
稽姬 2005-12-30
  • 打赏
  • 举报
回复
excel如果写得太大一定会有问题。即便直接操作excel。他可不是数据库啊
musachao 2005-12-30
  • 打赏
  • 举报
回复
Excel一个sheet只能容纳65535行,上万行没有问题。
关键是你的内存吃不消,要到close()的时候才真的写入。
数据量大的时候真的很难搞,每次释放内存,就会丢失信息。
等待高手出招……
TomyGuan 2005-09-28
  • 打赏
  • 举报
回复
excel的單元格最多有多少個字符是規定好的。多了就會那樣的了。
zjmoya 2005-09-28
  • 打赏
  • 举报
回复
长………………

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧