weixin_42407324
徐慧琳Sunny
2010-12-27 16:24

POI 生成Excel 分段处理问题

已采纳

大家好!

我在做java 生成Excel文件时,由于数据量很大(七万多条),我创建的文件扩展名是xlsx,一下不可以导入Excel中,下载做分段导入,就是在sql语句中(例如每次查询2000条),当第一次执行时,先创建Excel标题,然后把第一次查询的2000数据写入Excel中,然后一直循环,直到把全部数据写入。请问大侠们,怎么循环写入?用什么方法?

if(i == 0 )
{
     FileOutputStream os = new FileOutputStream(new File(“D:\\excel\a.xlsx”));
     XSSFWorkbook wb = new XSSFWorkbook();
//
     XSSFSheet sheet = (XSSFSheet) wb.createSheet("aaa");
//
     XSSFRow row = null;
     XSSFCell cell = null;
     int row_num = 0;
     int cell_num = 0;

     row = sheet.createRow(row_num);
     row.setHeightInPoints(30);
     sheet.autoSizeColumn(0, true);

     cell = row.createCell(cell_num++);
     ExcelUtil.setFormatTitleCenter(wb, cell);
     cell.setCellValue("SEQ");
    
     wb.write(os);
     os.close();
}
if(list.size()>0){
File file = new File(StringUtil.FILE_NAME);

String fullname = file.getAbsolutePath();

FileInputStream fs = new   FileInputStream(fullname);

XSSFWorkbook wb = new XSSFWorkbook(fs);

XSSFSheet   sheet   =   wb.getSheetAt(0);


PDTO dto = null;
Iterator itor = list.iterator();
  
XSSFRow row = null;
XSSFCell cell = null;

                   while( itor.hasNext() )
{
dto = (PipeDTO)itor.next();
i++;
//定义列
int j=0;
row = sheet.createRow(i);
//设置行长度自动
//row.setHeight((short)500);
row.setHeightInPoints(20);
//row.setZeroHeight(true);
sheet.autoSizeColumn(j+1, true);
//获得这一行的每j列
cell = row.createCell(j++);
//给单元格设值
ExcelUtil.setFormatLineRight(wb, cell);
cell.setCellValue(dto.getSeq);
}
FileOutputStream os = new FileOutputStream(new File(“D:\\excel\a.xlsx”));
wb.write(os);
os.close();
               }
               else
      {
break;
      }
这样执行是还是这样的错误,
[java] java.lang.ArrayIndexOutOfBoundsException: -32765
[java]     at java.util.ArrayList.get(Unknown Source)
[java]     at org.apache.poi.xssf.model.StylesTable.getFontAt(StylesTable.java:190)
[java]     at org.apache.poi.xssf.usermodel.XSSFWorkbook.getFontAt(XSSFWorkbook.java:592)
[java]     at org.apache.poi.xssf.usermodel.helpers.ColumnHelper.getColumnWidth(ColumnHelper.java:355)
[java]     at org.apache.poi.xssf.usermodel.XSSFSheet.autoSizeColumn(XSSFSheet.java:337)
[java]     at dlstx.monitor.data.pipe.PipeDAO.rt_code_check_error(PipeDAO.java:688)
[java]     at dlstx.monitor.data.ERPMonitor.pipeCheck(ERPMonitor.java:105)
[java]     at dlstx.monitor.data.ERPMonitor.main(ERPMonitor.java:53)
请指点,有没有好点的方法,怎么修改,十分感谢!

 

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

3条回答

  • goldbutterfly goldbutterfly 11年前

    这个必须用分页来获取数据,在分页的过程中,亦可以计算出excel的sheet数,可以将数据分别存储在不同的sheet中,在写的过程中,一定要注意对象的创建,否则容易出现OOM错误,如果非要写在一个文件中 建议你使用CSV格式

    点赞 评论 复制链接分享
  • luxixi3600 luxixi3600 11年前

    呵呵,不好意思,可能是我记错了,每2000行的操作考虑下分页的那种形式。

    点赞 评论 复制链接分享
  • luxixi3600 luxixi3600 11年前

    excel2007版最大只支持65535行,你有7w多行,无论你下载写入还是什么写入,都会出错的。

    建议考虑一下csv格式。

    点赞 评论 复制链接分享