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

smilejason 2005-09-23 08:24:07

最近在做一个移动电信的数据集市项目,使用的是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;
}
...全文
99 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
jack286 2005-12-20
  • 打赏
  • 举报
回复
肯定要关注一下

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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