XSSFWorkbook和SXSSFWorkbook两个对象读取模板

    技术2023-07-12  87

    一、简单说明

    1. XSSFWorkbook对象来读取模板   有时候为了方便,我们需要会用POI的XSSFWorkbook对象来读取模板,然后将数据填充在读取的模板中,但是当你数据量过大时,官方XSSFWorkbook说最多导出65535行,但实际可能达不到这个数量就会报OOM(内存溢出)的错误了。

    2. SXSSFWorkbook导出大数据量的数据(104W+)   为了解决大数据量导出的问题,又出现了一个新的对象SXSSFWorkbook,但是SXSSFWorkbook不能支持直接读取模板了,也就是说我们直接使用此对象无法读取模板的内容。

    二、使用两个对象遇到的问题

    1. 尝试使用SXSSFWorkbook对象读取模板   为什么要尝试呢?毕竟它可以导出百万级别的数据(理论上可以,后面我们会提到)

    2. SXSSFWorkbook对象不能直接读取模板   官方文档里提供了 public SXSSFWorkbook(XSSFWorkbook workbook)这个构造方法,将XSSFWorkbook转为SXSSFWorkbook,这样我们可以使用SXSSFWorkbook.getSheetAt(int index)获得sheet,接着往下我们又发现了一个问题,这种方式取不到Row对象的,报了空指针异常,所以我如果想对模板进行修改的话又实现不了,经过查找最终有了些端倪。

    有修改模板的需求:

    /* 注意:这种方式只能设置值,但是不能改变已经存在的值,如果想要改变的话只能重新create你想要改变的行或者单元格, 这样再去重新设置行或者单元格就好了。 */ //获取XSSFWorkbook对象 XSSFWorkbook wb = new XSSFWorkbook(new File("C:\\Users\\Administrator\\Desktop\\XXXXXX.xlsx")); //获取SXSSFWorkbook对象 SXSSFWorkbook swb = new SXSSFWorkbook(wb,100); //根据SXSSFWorkbook 获取XSSFWorkbook对象的Sheet XSSFWorkbook xssfWorkbook = swb.getXSSFWorkbook(); //获取sheet页 XSSFSheet sheet = xssfWorkbook.getSheetAt(0); //获取行单元格并且设置值 Row row = xssfSheet.getRow(1); Cell cell = row.getCell(2); cell.setCellValue("cehi2"); swb.write(new FileOutputStream("C:\\Users\\Administrator\\Desktop\\ceshi.xlsx")); ......

    没有修改模板的需求:

    //获取XSSFWorkbook对象 XSSFWorkbook wb = new XSSFWorkbook(new FileInputStream(new File("C:\\Users\\Administrator\\Desktop\\XXXXXX.xlsx"))); //获取SXSSFWorkbook对象 SXSSFWorkbook swb = new SXSSFWorkbook(wb,100); //XSSFWorkbook xssfWorkbook = swb.getXSSFWorkbook(); Sheet sheet = swb.getSheetAt(0); /* 此时如果这样操作:Row row = sheetAt.getRow(0); row对象为null 也就是说只能作为模板不能进行修改,必须创建新的row对象来进行操作(已存在的行索引也不能用) */ Row row = sheet.createRow(”新的行索引“); .....

    3. POI注意问题(关于内存)

      poi 3.0以后的版本不支持读取模板,使用的是临时文件(XML)的方式来释放内存,但是程序运行的过程中,数据量过大使用sxxsf对象来创建excel及时设置了写入临时文件(500个对象)也会发生堆内存不足的情况,因为磁盘速度始终会比内存速度慢,在某时间,还没来及写到磁盘,但是堆内存已经满了,就会出现堆内存不足的情况。

    Processed: 0.016, SQL: 9