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般变化了~

猜你喜欢

转载自blog.csdn.net/sinat_38259539/article/details/84543821