Java 使用 Poi 匯入 Excel 通用(一)
阿新 • • 發佈:2019-01-02
上一篇【Java實現從網頁上傳匯入excel資料到資料庫】一文中利用poi 匯入excel工具只是一個簡版,今天利用反射機制重新寫一個通用excel匯入工具類,可供大家參考使用
實現思路:
利用java反射機制把excel讀取出來的值放進相對應的實體成員變數中
工作簿 中的列必須與實體成員變數順序和型別一致
核心程式碼:
import java.io.File; import java.io.IOException; import java.lang.reflect.Method; import java.lang.reflect.ParameterizedType; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import org.apache.commons.fileupload.disk.DiskFileItem; import org.apache.commons.io.FileUtils; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFDateUtil; import org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.formula.functions.T; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.FormulaEvaluator; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFDataFormat; import org.apache.poi.xssf.usermodel.XSSFFormulaEvaluator; import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.commons.CommonsMultipartFile; import com.mysql.jdbc.Field; /** * @author DevinLiu * 通用excel匯入資料庫 */ public class ExcelUtil { private final static String excel2003L =".xls"; //2003- 版本的excel private final static String excel2007U =".xlsx"; //2007+ 版本的excel /** * 獲取實體物件返回屬性名稱 * @param obj 實體物件 * @return * @throws Exception */ public java.lang.reflect.Field[] findEntityAllTypeName(Object obj)throws Exception{ Class<? extends Object> cls = obj.getClass(); return cls.getDeclaredFields(); } /** * 根據檔案選擇excel版本 * @return * @throws Exception */ public Workbook chooseWorkbook(MultipartFile file) throws Exception{ Workbook workbook = null; //把MultipartFile轉化為File CommonsMultipartFile cmf = (CommonsMultipartFile)file; DiskFileItem dfi = (DiskFileItem) cmf.getFileItem(); File fo = dfi.getStoreLocation(); String filename = file.getOriginalFilename(); String fileType = (filename.substring(filename.lastIndexOf("."), filename.length())).toLowerCase(); if(excel2003L.equals(fileType)){ workbook = new HSSFWorkbook(FileUtils.openInputStream(fo)); //2003- }else if(excel2007U.equals(fileType)){ workbook = new XSSFWorkbook(FileUtils.openInputStream(fo)); //2007+ }else{ throw new Exception("解析的檔案格式有誤!"); } return workbook; } /** * 公共的匯入excel方法 * @param file 檔案 * @param sheetname 工作簿名稱 * @param obj 實體類 * @return * @throws IOException */ public List<Object> importBaseExcel(MultipartFile file,String sheetname,Object obj) throws IOException{ Workbook workbook = null; try { //讀取檔案內容 workbook = this.chooseWorkbook(file); //獲取工作表 Sheet sheet = workbook.getSheet(sheetname); //獲取sheet中第一行行號 int firstRowNum = sheet.getFirstRowNum(); //獲取sheet中最後一行行號 int lastRowNum = sheet.getLastRowNum(); //獲取該實體所有定義的屬性 返回Field陣列 java.lang.reflect.Field[] entityName = this.findEntityAllTypeName(obj); String classname = obj.getClass().getName(); Class<?> clazz = Class.forName(classname); List<Object> list = new ArrayList<Object>(); //迴圈插入資料 for(int i=firstRowNum+1;i<=lastRowNum;i++){ Row row = sheet.getRow(i); //可以根據該類名生成Java物件 Object pojo = clazz.newInstance(); //除自增編號外,實體欄位匹配sheet列 for(int j = 0;j < entityName.length-3;j++){ //獲取屬性的名字,將屬性的首字元大寫,方便構造set方法 String name = "set"+entityName[j+1].getName().substring(0, 1).toUpperCase().concat(entityName[j+1].getName().substring(1).toLowerCase())+""; //獲取屬性的型別 String type = entityName[j+1].getGenericType().toString(); Method m = null; //getMethod只能呼叫public宣告的方法,而getDeclaredMethod基本可以呼叫任何型別宣告的方法 m = obj.getClass().getDeclaredMethod(name,entityName[j+1].getType()); Cell pname = row.getCell(j); //根據屬性型別裝入值 switch (type) { case "char": case "java.lang.Character": case "class java.lang.String": m.invoke(pojo,getVal(pname)); break; case "int": case "class java.lang.Integer": m.invoke(pojo,Integer.valueOf(getVal(pname))); break; case "class java.util.Date": m.invoke(pojo,getVal(pname)); break; case "float": case "double": case "java.lang.Double": case "java.lang.Float": case "java.lang.Long": case "java.lang.Short": case "java.math.BigDecimal": m.invoke(pojo,Double.valueOf(getVal(pname))); break; default: break; } } list.add(pojo); } return list; } catch (Exception e) { e.printStackTrace(); } finally { workbook.close(); } return null; } /** * 處理型別 * @param cell * @return */ public static String getVal(Cell cell) { if (null != cell) { switch (cell.getCellType()) { case XSSFCell.CELL_TYPE_NUMERIC: // 數字 String val = cell.getNumericCellValue()+""; int index = val.indexOf("."); if(Integer.valueOf(val.substring(index+1)) == 0){ DecimalFormat df = new DecimalFormat("0");//處理科學計數法 return df.format(cell.getNumericCellValue()); } return cell.getNumericCellValue()+"";//double case XSSFCell.CELL_TYPE_STRING: // 字串 return cell.getStringCellValue() + ""; case XSSFCell.CELL_TYPE_BOOLEAN: // Boolean return cell.getBooleanCellValue() + ""; case XSSFCell.CELL_TYPE_FORMULA: // 公式 try{ if(HSSFDateUtil.isCellDateFormatted(cell)){ Date date = cell.getDateCellValue(); return (date.getYear() + 1900) + "-" + (date.getMonth() + 1) +"-" + date.getDate(); }else{ return String.valueOf((int)cell.getNumericCellValue()); } }catch (IllegalStateException e) { return String.valueOf(cell.getRichStringCellValue()); } case XSSFCell.CELL_TYPE_BLANK: // 空值 return ""; case XSSFCell.CELL_TYPE_ERROR: // 故障 return ""; default: return "未知型別 "; } } else { return ""; } } }
Java 使用 Poi 匯出 Excel 通用(二)