poi的使用匯入Excel表格的工具類封裝到JavaBean物件之中
阿新 • • 發佈:2018-12-25
經過幾天的不眠不夜的奮戰(哈哈,開個玩笑),咳咳正經點,這幾天自己封裝了一個Excel表格的匯入(本人是菜鳥所以是幾天,經過大量測試,和自己的需求,如果有其它的表格形式需要自己改寫),我在這裡做一個筆記,僅供自己以後忘了,沒有別的意圖。偶對了,是用泛型+反射進行封裝的、下面活不多說上程式碼。
1、先編寫工具類
package com.huayi.dayan.util; import org.apache.poi.hssf.usermodel.*; import org.apache.poi.ss.usermodel.*; import java.io.*; import java.lang.reflect.Field; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.*; /** * 作者:machao 2018-11-26 * poi 實現 excel 匯入 工具類 */ public class POIExcelImportUtil { public static <T>List<T> encapsulationJaveBean(InputStream inputStream,T t,String dateString)throws IOException{ List<T> tList=new ArrayList<>(); //根據指定的檔案輸入流匯入Excel從而產生Workbook物件 HSSFWorkbook wb0 = new HSSFWorkbook(inputStream); // Workbook wb0 = new HSSFWorkbook(fileIn); //獲取Excel文件中的第一個表單 Sheet sht0 = wb0.getSheetAt(0); //對Sheet中的每一行進行迭代 for (Row r : sht0) { //如果當前行的行號(從0開始)未達到2(第三行)則從新迴圈 if(r.getRowNum()<1){ continue; } Class clazz = t.getClass(); Field[] fieldArray = clazz.getDeclaredFields(); try { Object obj = clazz.getConstructor().newInstance();//產生新的物件--》Student stu = new Student(); for (int i =0 ;i<fieldArray.length;i++) { Field f=fieldArray[i]; f = clazz.getDeclaredField(f.getName().toString()); f.setAccessible(true);//暴力反射,解除私有限定 if (f.getType().equals(String.class)){ f.set(obj, getCellValue(r.getCell(i))); }else if (f.getType().equals(Integer.class)){ f.set(obj, Integer.valueOf(getCellValue(r.getCell(i)))); }else if (f.getType().equals(Long.class.getName())){ f.set(obj,Long.valueOf(getCellValue(r.getCell(i)))); }else if (f.getType().equals(Float.class)){ f.set(obj, Float.valueOf(getCellValue(r.getCell(i)))); }else if (f.getType().equals(Double.class)){ f.set(obj, Double.valueOf(getCellValue(r.getCell(i)))); }else if (f.getType().equals(Byte.class)){ f.set(obj, Byte.valueOf(getCellValue(r.getCell(i)))); }else if (f.getType().equals(Boolean.class)){ f.set(obj, Boolean.valueOf(getCellValue(r.getCell(i)))); }else if (f.getType().equals(Date.class)){ SimpleDateFormat sdf = new SimpleDateFormat(dateString); Date date=null; try { date=sdf.parse(getCellValue(r.getCell(i))); } catch (Exception e) { e.printStackTrace(); } f.set(obj, date); }else { f.set(obj, getCellValue(r.getCell(i))); } } tList.add((T)obj); } catch (Exception e) { e.printStackTrace(); } } return tList; } /** * 功能:獲取單元格的值 */ private static String getCellValue(Cell cell) { Object result = ""; if (cell != null) { switch (cell.getCellType()) { case Cell.CELL_TYPE_STRING: result = cell.getStringCellValue(); break; case Cell.CELL_TYPE_NUMERIC: if (DateUtil.isCellDateFormatted(cell)) { Date theDate = cell.getDateCellValue(); SimpleDateFormat dff = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); result = dff.format(theDate); }else{ DecimalFormat df = new DecimalFormat("0"); result = df.format(cell.getNumericCellValue()); } break; case Cell.CELL_TYPE_BOOLEAN: result = cell.getBooleanCellValue(); break; case Cell.CELL_TYPE_FORMULA: result = cell.getCellFormula(); break; case Cell.CELL_TYPE_ERROR: result = cell.getErrorCellValue(); break; case Cell.CELL_TYPE_BLANK: break; default: break; } } return result.toString(); } }
2、在controller中進行測試
List<BusinessCarExcel> tempListOneTem = POIExcelImportUtil.encapsulationJaveBean(excelFile.getInputStream(),new BusinessCarExcel(),DATE_FORMAT_YMD);
注意:其中exelFile為輸入流,new BusinessCarExcel()為要返回的物件,DATE_FORMAT_YMD為Excel的日期格式本人的日期格式是:
final static String DATE_FORMAT_YMD = "yyyy-MM-dd";
3、特別注意編寫的new BusinessCarExcel()它必須和Excel的表格欄位一一對應,並且順序不能錯亂。不然封裝的時候欄位就會不是你想要的結果
excel表格格式,
javabean的格式。
好了~菜鳥的筆記到此結束。以後就靠它演變72般變化了~