徐慧琳Sunny 2010-12-27 16:24
浏览 317
已采纳

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 2010-12-27 20:28
    关注

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?
  • ¥15 乘性高斯噪声在深度学习网络中的应用
  • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决