1. 程式人生 > >SXSSFWorkbook XSSFWorkbook 我所遇到的坑大集合,希望能幫助更多的人。

SXSSFWorkbook XSSFWorkbook 我所遇到的坑大集合,希望能幫助更多的人。

坑一:為什麼模板中的資料獲取不到?

當你企圖使用SXSSFWorkbook去載入一個已存在的Excel模板時,首先你應該用XSSFWorkbook去獲取它 

XSSFWorkbook(java.io.File file)
XSSFWorkbook(java.io.InputStream is)
XSSFWorkbook(OPCPackage pkg)
XSSFWorkbook(java.lang.String path)

以上列舉了常用的四種獲取XSSFWorkbook的方式。接下來如果你要對這個Excel模板做大量行列操作時,如果用XSSF的create方法勢必會導致記憶體溢位。於是我們要使用SXSSFWorkbook去完成這個操作。

根據我對SXSSFWorkbook的瞭解,它只會載入一部分資料到記憶體,其餘的資料全部持久化到本次磁碟。

但是當你噼裡啪啦對SXSSFWorkbook進行了一頓操作時,你會忽然發現為什麼SXSSFSheet.getRow(0) = null???

這是因為這些記錄存在於XSSFWorkbook中,你需要用sxssfWorkbook.getXSSFWorkbook()方法去獲取初始模板的行資料。

坑二:SXSSFWorkbook為什麼我Create了一萬行Row但是卻獲取不到?

當你對SXSSFWorkbook裡的SXSSFSheet增加了1w或許多Row時,這個時候你需要留意一下你SXSSFWorkbook的構造器如何定義的。我們要注意SXSSFWorkbook構造器有一些引數,其中有一個rowAccessWindowSize。我個人的理解是這是一個記憶體視窗的大小,什麼意思呢就是能從Sheet視窗看到多少剛才Create了多少Row,如果你設定rowAccessWindowSize為1000,那麼你只能看到1000條新建立的資料,如果你設定為 -1

那麼你將會看到全部建立的資料

坑三:Attempting to write a row[0] in the range [0,0] that is already written to disk是什麼鬼?

根據我的經驗:這是由於你用XSSFWorkbook獲取Excel模板的時候已經存在了行,然後用SXSSFWorkbook在Create這行的時候會報這個錯誤。例如我自己定義的學生表.xlsx

        XSSFWorkbook xssfWorkbook = new XSSFWorkbook("J:\\學生表.xlsx");
        SXSSFWorkbook sxssfWorkbook = new SXSSFWorkbook(xssfWorkbook,-1);
        sxssfWorkbook.getSheetAt(0).createRow(0);

注意看當我CreateRow第0行的時候 會報錯

所以你應該從索引1開始CreateRow。

坑四:我Write完Excel後物件怎麼空了?

先上程式碼講解

        XSSFWorkbook xssfWorkbook = new XSSFWorkbook("J:\\學生表.xlsx");
        SXSSFWorkbook sxssfWorkbook = new SXSSFWorkbook(xssfWorkbook,-1);
        sxssfWorkbook.getSheetAt(0);
        SXSSFSheet sxssfSheet = sxssfWorkbook.getSheetAt(0);
        SXSSFRow sxssfRow1 = sxssfSheet.createRow(1);
        sxssfRow1.createCell(0).setCellValue("000001");
        sxssfRow1.createCell(1).setCellValue("ljh");
        sxssfRow1.createCell(2).setCellValue("18");

        OutputStream op = new FileOutputStream("J:\\學生表New.xlsx");
        sxssfWorkbook.write(op);
        op.close();

        System.out.println(sxssfWorkbook.getSheetAt(0).getRow(1).getCell(0));
        System.out.println(sxssfWorkbook.getSheetAt(0).getRow(1).getCell(1));
        System.out.println(sxssfWorkbook.getSheetAt(0).getRow(1).getCell(2));

首先我們建立一個SXSSFWorkbook 然後create了一行三列,並且賦值完。之後使用OutputStream輸出這個文件。

但是當我後下面在輸出日誌的時候卻爆出了空指標異常!所以如果你希望繼續使用該Workbook,請在之後進行Write操作!