Java讀取excel(大量數據15W以上的)


處理大批量的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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM