经过几天的不眠不夜的奋战(哈哈,开个玩笑),咳咳正经点,这几天自己封装了一个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般变化了~