1. 程式人生 > >poi的使用匯入Excel表格的工具類封裝到JavaBean物件之中

poi的使用匯入Excel表格的工具類封裝到JavaBean物件之中

經過幾天的不眠不夜的奮戰(哈哈,開個玩笑),咳咳正經點,這幾天自己封裝了一個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般變化了~