POI使用SAX处理大量数据的xlsx格式的Excel文件

    POI在处理Excel方面确实比较方便,但是当Excel数据量比较大的时候,使用POI处理就会导致java.lang.OutOfMemoryError: Java heap space的错误,当有大量数据写入xlsx文件时,POI为我们提供了SXSSFWorkBook类来处理,这个类的处理机制是当内存中的数据条数达到一个极限数量的时候就flush这部分数据,再依次处理余下的数据,这个在大多数场景能够满足需求。当对一个存有大量数据的文件的xlsx文件进行读操作时,使用WorkBook处理就不行了,因为POI对文件是先将文件中的cell读入内存,生成一个树的结构(针对Excel中的每个sheet,使用TreeMap存储sheet中的行)。如果数据量比较大,则同样会产生java.lang.OutOfMemoryError: Java heap space错误。这个错误明显就是内存不足,虽然可以通过调整JVM堆区域内存大小来解决,但是一定的内存只能解决一定的数据量,当文件的大小并不确定的时候使用调整堆内存大小的方法并不能很优雅的解决这个问题,POI官方推荐使用“XSSF and SAXevent API”方式来解决,即使用SAX对xlsx中的sheet.xml文件进行解析,然后根据MS的OOXML格式规范在sheet.xml,style.xml和sharedString.xml中解析数据。如果我们直接使用SAX对这些xml进行解析,则必须使用SAX中的三个方法startElement,characters和endElement解析到sheet.xml中的数据,再在style.xml中解析出格式,或者到sharedString.xml中解析数据,所以必须熟悉MS的OOXML规范,幸运的是

POI官方为我们提供了eventusermodel来解决这个问题。在POI-OOXML这个jar包中有org.apache.poi.xssf.eventusermodel这个包,XSSFSheetXMLHandler这个类可以返回的数据已经全部转换成String类型,只需要实现POI定义的SheetContentsHandler接口就可以很方便的获取到xlsx文件中的数据了。

你可能感兴趣的:(Excel)