Java-POI-读取-大数据量的Excel-实操
目录
Java POI 读取 大数据量的Excel 实操
Java POI 读取 大数据量(超过10W行)的excel的操作
0.问题抛出
在使用poi 进行excel文件读取操作的时候,
如果文件包含的数据量很大,比如包含了10万行的数据,
那么在使用 【Workbook workbook2 = WorkbookFactory.create(inputStrem);】
这种形式读取的时候就会发现异常的慢,甚至是内存都要溢出了还是没有读取出来。
问题原因就是,上述的方式 是一下子将文件全部加载进入内存中,自然需要消耗许多的内存资源和时间。
为了解决上述问题,特记录如下方式。
下面的方式思路就是 : 批量的去加载数据,降低内存的消耗,从而实现程序的流畅运行。
1.说明
1.本文记录了Java在读取包含大数据量的excel的时候的操作,
2.此处的大数据量指的是excle中包含了较多的行数,比如包含了10万行的数据;
3.本文记录的方式只适用于【读取】excel的内容;
4.本文记录的方式只适用于【.xlsx】为后缀的excel文件。
2.引入依赖
<!-- excel工具 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
<!-- 读取大量excel数据时使用到的两个 -->
<dependency>
<groupId>com.monitorjbl</groupId>
<artifactId>xlsx-streamer</artifactId>
<version>2.1.0</version>
</dependency>
<dependency>
<groupId>xml-apis</groupId>
<artifactId>xml-apis</artifactId>
<version>1.4.01</version>
</dependency>
3.案例代码
public void importExcelData()throws Exception{
// 指定文件的路径
String filePath = "aa.xlsx";
// 创建输入流对象
FileInputStream fileInputStream = new FileInputStream(new File(filePath));
// 【核心操作】 : 使用下面的方式来获取 Workbook 对象
Workbook workbook = StreamingReader.builder()
.bufferSize(4096) // 设置缓存的大小
.rowCacheSize(100) // 缓存行的数量,也就是每次读取多少行到内存中,而不是一下子全都加载进内存
.open(fileInputStream); // 设置要打开的文件
Sheet sheet = workbook.getSheetAt(0);
//遍历所有的行进行文件的读取
for (Row row : sheet) {
// 遍历每一行的数据
for(Cell cell : row){
System.out.println(cell.getStringCellValue() +" ");
// 此时已经读取到了 某一行的某一列的数据
// 在这里就可以填充自己具体的业务逻辑了
}
System.out.println(" ");
}
fileInputStream.close();
}