Java讀取Excel表格到物件之優化
阿新 • • 發佈:2019-02-03
在前面,雖然可以從excel讀取轉化為物件,但是如果一個類的欄位太多,每次都要通過set來設值,很浪費時間, 還有許多類似的類如果都要匯入的話,為每個類設計一個方法顯得太愚蠢,所以決定設計一個工具類,能夠自動轉換為想要的,通過反射和泛型來實現:
注意!在這裡面預設的為表格的第一列對應類的第一個變數,如果對應相隔幾個位置或者類有繼承的變數,可以通過修改迴圈中的i和i與表格列的差來使用。
public <T> List<T> readExcel(File file, Class<T> c) throws Exception { //獲取檔名字 String fileName = file.getName(); //獲取檔案型別 String fileType = fileName.substring(fileName.lastIndexOf(".") + 1); System.out.println(" **** fileType:" + fileType); //獲取輸入流 InputStream stream = new FileInputStream(file); //獲取工作薄 Workbook xssfWorkbook = null; if (fileType.equals("xls")) { xssfWorkbook = new HSSFWorkbook(stream); } else if (fileType.equals("xlsx")) { xssfWorkbook = new XSSFWorkbook(stream); } else { System.out.println("您輸入的excel格式不正確"); } List<T> list = new ArrayList<T>(); // Read the Sheet Sheet Sheet = xssfWorkbook.getSheetAt(0); // Read the Row 從0開始 for (int rowNum = 0; rowNum <= Sheet.getLastRowNum(); rowNum++) { Row Row = Sheet.getRow(rowNum); if (Row != null) { //判斷這行記錄是否存在 if (Row.getLastCellNum() < 1 || "".equals(getValue(Row.getCell(1)))) { continue; } //獲取每一行 //反射獲取例項 T t = c.newInstance(); //獲取私有變數 Field[] fields = c.getDeclaredFields(); //迴圈賦值 for(int i=0;i<fields.length-1;i++){ fields[i].setAccessible(true); fields[i].set(t, getValue(Row.getCell(i))); } list.add(t); } } return list; } private String getValue(Cell cell){ int type = CellFormat.ultimateType(cell); if(type == Cell.CELL_TYPE_BOOLEAN) { return String.valueOf(cell.getBooleanCellValue()); } else if(type == Cell.CELL_TYPE_NUMERIC) { return String.valueOf(cell.getNumericCellValue()); } else if(type == Cell.CELL_TYPE_BLANK) { return ""; } else { return cell.getStringCellValue().trim(); } }
注意!在這裡面預設的為表格的第一列對應類的第一個變數,如果對應相隔幾個位置或者類有繼承的變數,可以通過修改迴圈中的i和i與表格列的差來使用。