處理大批量的excel表格數據
只能是 xlsx格式的excel表格
常用的讀取:
FileInputStream fi = new FileInputStream("e:/2.xlsx"); XSSFWorkbook wk = new XSSFWorkbook(fi);
然后再獲取對應的Sheet、Row和Cell,然后獲取excel中的內容,但是這種方式POI會把文件的所有內容都加載到內存中,讀取大的excel文件時很容易占用大量內存。
后來接觸到了一款工具:Excel Streaming Reader:
使用Excel Streaming Reader,這個第三方工具會把一部分的行(可以設置)緩存到內存中,在迭代時不斷加載行到內存中,而不是一次性的加載所有記錄到內存,這樣就可以不斷的讀取excel內容並且不影響內存的使用。
但是這個工具也有一定的限制:只能用於讀取excel的內容,寫入操作不可用;可以使用getSheetAt()方法獲取到對應的Sheet,因為當前只是加載了有限的row在內存中,因此不能隨機訪問row,即不能使用getRow(int rowNum)方法;由於行數據已經加載到了內存,因此可以隨機的訪問Cell數據,即可以使用getCell(int cellnum)方法。使用這個工具,建議使用迭代器來進行迭代。具體內容可以參見:https://github.com/monitorjbl/excel-streaming-reader。
首先要在pom文件導入相應的依賴
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.0.0</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.0.0</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-scratchpad</artifactId> <version>4.0.0</version> </dependency> <!-- 讀取大量excel數據時使用 --> <dependency> <groupId>com.monitorjbl</groupId> <artifactId>xlsx-streamer</artifactId> <version>2.1.0</version> </dependency>
poi相關的依賴要4.0以上,該工具官網有說明白
相應的例子:
public void testLoad() throws Exception{
FileInputStream in = new FileInputStream("e:/2.xlsx");
Workbook wk = StreamingReader.builder()
.rowCacheSize(100) //緩存到內存中的行數,默認是10
.bufferSize(4096) //讀取資源時,緩存到內存的字節大小,默認是1024
.open(in); //打開資源,必須,可以是InputStream或者是File,注意:只能打開XLSX格式的文件
Sheet sheet = wk.getSheetAt(0);
//遍歷所有的行
for (Row row : sheet) {
System.out.println("開始遍歷第" + row.getRowNum() + "行數據:");
//遍歷所有的列
for (Cell cell : row) {
System.out.print(cell.getStringCellValue() + " ");
}
System.out.println(" ");
}
}
public static void main(String[] args) throws Exception {
Test t = new Test();
t.testLoad();
}
根據個人需求改。
參考:https://www.cnblogs.com/cksvsaaa/p/7280261.html
