java 讀取excel獲取真實行數
阿新 • • 發佈:2018-11-19
剛進入公司開發,熟悉環境是個很大的難題,今天就接到了一個任務,讓我修改批量上傳excel檔案的頁面.
公司採用的是apache提供的包,通過XML檔案的對映,把EXCEL表和我們的Model對應起來.本來是校驗正確的,結果莫名其妙到後面就會報空指標異常.
問題的原因:在沒有格式的前提下,getLastRowNum方法能夠正確返回最後一行的位置;getPhysicalNumberOfRows方法能夠正確返回物理的行數;
* 在有格式的前提下,這兩個方法都是不合理的;
* 所以,在做匯入excel的時候,建議想要正確獲取行數,可以做一個人為的約定,比如約定匯入檔案第一列不允許為空,行數就按照第一列的有效行數來統計;這樣就能正確獲取到實際想要的行數;
更新版本, 因為發現有時候 存在了加了樣式的邊框,邊框的屬性預設成為了 公式屬性,導致後面空指標,現已修復
修改版
/** * 用來得到真實行數 * @param sheet * @param flag 需要寫進資料庫的列數用逗號隔開 比如 (Sheet sheet,int 2,int 3);隨意個 * @return * */ public static int findRealRows(Sheet sheet, int... flag) { int row_real = 0; int rows = sheet.getPhysicalNumberOfRows();// 此處物理行數統計有錯誤, int size = flag.length; try { for (int i = 1; i < rows; i++) { Row row = sheet.getRow(i); int total = 0; ArrayList<Integer> blank =new ArrayList<Integer>(); int type=-1; String s = null; for(int j:flag){ if(!(row.getCell(j) == null)&&row.getCell(j).getCellType()<2){ type=row.getCell(j).getCellType(); row.getCell(j).setCellType(1); } if (row.getCell(j) == null||row.getCell(j).getStringCellValue().matches("^\\s+$")||row.getCell(j).getCellType()>2) { total++; if(!(row.getCell(j) == null)&&row.getCell(j).getCellType()<2){ row.getCell(j).setCellType(type); } blank.add(j); } } System.out.println(s+"我"); // 如果4列都是空說明就該返回 if (total == flag.length) { return row_real; } else if (total == 0) { row_real++; } else { String h=""; for(Integer b:blank){ h=h+"第"+(b+1)+"列"+" "; } throw new BusinessException("第" + (i + 1) + "行" + h + "不能為空"); } } } catch (NullPointerException e) { throw new BusinessException("excel格式異常,請檢查excel格式有無資料缺失,無效資料行!"); } return row_real; }
方法都這樣,通過約定一個有的ID來進行判斷,可以較快的得到真實的行數 ,以至於後面的集合迴圈輸出的話不會出現空指標異常