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操作!