1. 程式人生 > >Java 使用 Poi 匯入 Excel 通用(一)

Java 使用 Poi 匯入 Excel 通用(一)

上一篇【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 通用(二)​​​​​​​