一、使用XSSFWorkbook 直接读取大excel时,直接报java.lang.OutOfMemoryError: Java heap space
XSSFWorkbook xssfWorkbook=new XSSFWorkbook("xxx");
二、因此引进包xlsx-streamer来使用流读取(poi相关包需要在4.0以上)。
<dependency>
<groupId>com.monitorjbl</groupId>
<artifactId>xlsx-streamer</artifactId>
<version>2.2.0</version>
</dependency>
三、代码改成如下
InputStream is = new FileInputStream(new File("xxx"));
Workbook workbook = StreamingReader.builder()
.rowCacheSize(1000) // 缓存到内存中的行数(默认是10)
.bufferSize(10240) // 读取资源时,缓存到内存的字节大小(默认是1024)
.open(is);
Sheet sheet = workbook.getSheetAt(0);
四、此时的sheet无法随机访问某一行,调用如下getRow()方法会报错。只能通过for来遍历全部。
Row row = sheetAt.getRow(2);//报错
for (Row row: sheet) {
//成功
}
五、所以可以先为此excel文件创建一个实体类或者直接使用JSONObject,先把excel里的数据读取到List内存中,再对整个List进行操作就能实现随机访问。
List<Data> dataList = new ArrayList<>();
for (Row cells : sheetAt) {
String itemId = cells.getCell(0).getStringCellValue();
String desc = cells.getCell(1).getStringCellValue();
String h9Model = cells.getCell(5).getStringCellValue();
String h9Brand = cells.getCell(6).getStringCellValue();
dataList.add(new Data(itemId, desc, h9Model, h9Brand));
}
//接下来对dataList进行相关操作