XSSFWorkbook读取excel模板,SXSSFWorkbook导出大数据量 填坑

使用的POI版本为3.10.1,版本较老

项目里遇到需要读取特定模板,然后将数据装载在模板里导出的场景(之前用的都是XSSFWorkbook导出)。但是当你数据量过大时,官方XSSFWorkbook说最多导出65535行,但是个人实际操作后发现远远没到这个数量,两万左右就报OOM(内存溢出)了。

  因此,为了解决大数据量导出的问题,查完官方文档之后,可以使用SXSSFWorkbook导出。但是SXSSFWorkbook不能读取文件。也就是说我们无法读取模板的内容,因此需要将XSSFWorkbook与SXSSFWorkbook结合起来使用。

   官方文档里提供了 public SXSSFWorkbook(XSSFWorkbook workbook)构造方法,将XSSFWorkbook转为SXSSFWorkbook,

这是可以通过SXSSFWorkbook.getSheetAt(int index)获得sheet,但是再通过sheet.getRow(int rownum)去获得行时,会发现行数据为空,报空指针异常。

       经过多番查询之后,发现原因是因为这些记录存在于XSSFWorkbook中,你需要用sxssfWorkbook.getXSSFWorkbook()方法去获取初始模板的行数据。(操蛋)

      所以需要下面这么一个看起来有点傻屌的操作:

InputStream inp=ExcelUtil.class.getResourceAsStream("/template/xls/patBgRecord.xlsx");
XSSFWorkbook wb = new XSSFWorkbook(inp);
SXSSFWorkbook swb = new SXSSFWorkbook(wb,100);
XSSFWorkbook xssfWorkbook = swb.getXSSFWorkbook();
XSSFSheet sheet = xssfWorkbook.getSheetAt(0);

然后你就可以拿着这个sheet,将你的模板中填充你的数据。

如果导出大数据量的表格,还是需要通过sxssfWorkbook创建一个sheet去导出。

Sheet sheetAt = swb.getSheetAt(0);

关键代码:

XSSFWorkbook读取excel模板,SXSSFWorkbook导出大数据量 填坑_第1张图片

XSSFWorkbook读取excel模板,SXSSFWorkbook导出大数据量 填坑_第2张图片

sxssfWorkbook,XSSFWorkbook 交替使用灵活使用

XSSFWorkbook读取excel模板,SXSSFWorkbook导出大数据量 填坑_第3张图片

 

你可能感兴趣的:(java)