这里的场景是将execl放在项目下,启动项目时对其解析,加载到内存中使用。
pom:
<dependency>
<groupId>com.monitorjbl</groupId>
<artifactId>xlsx-streamer</artifactId>
<version>2.1.0</version>
</dependency>
<dependency>
<artifactId>poi</artifactId>
<groupId>org.apache.poi</groupId>
</dependency>
@PostConstruct
public void initData() {
try {
Long startTime = System.currentTimeMillis();
// File file = ResourceUtils.getFile("classpath:data/test.xlsx");
InputStream stream = getClass().getClassLoader().getResourceAsStream("data/test.xlsx");
Workbook workBook = StreamingReader.builder().rowCacheSize(1000).bufferSize(4096).open(stream);
Sheet sheet = workBook.getSheetAt(0);
for (Row row : sheet) {
if (row.getRowNum() < 1 || row.getRowNum() > sheet.getLastRowNum()) {
continue;
}
parseOneRow(row);
}
Long endTime = System.currentTimeMillis();
} catch (Exception e) {
log.error("...message: " );
}
}
注意当项目打包部署到服务器时,用ResourceUtils.getFile("classpath:data/test.xlsx")是获取不到Jar包中的execl的。
所以用getClass().getClassLoader().getResourceAsStream("data/test.xlsx")获取,再以流的方式读取、解析。