1. 程式人生 > >java 讀取excel獲取真實行數

java 讀取excel獲取真實行數

剛進入公司開發,熟悉環境是個很大的難題,今天就接到了一個任務,讓我修改批量上傳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來進行判斷,可以較快的得到真實的行數 ,以至於後面的集合迴圈輸出的話不會出現空指標異常

原文地址:https://blog.csdn.net/hn5091/article/details/44179961