package com.homelink.perform.module.perform.util;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
/**
* 导入Excel xlsx 2007工具类
*
* @author fangxiaowen
* @date 2013-07-11
*/
public final class ExcelReader {
/**
* 私有构造 保证该类不能被实例化
*/
private ExcelReader() {
}
/**
* 把Excel中的数据封装在结果集中
* @param 要导入的文件的路径
* @return java.util.List<
Object
>
*/
public static List<
Object
> excelReader(String path) {
List<
Object
> list = null;
try {
XSSFWorkbook xs = new XSSFWorkbook(path);
XSSFSheet sheet = xs.getSheetAt(0); // 读取第一章表格内容
String classPath = null; // sheet的名字就是类路径
XSSFRow row; // 定义 row
String cell; // 定义 cell
Object object = null;
int i = 0; // 从第二行开始取数据
list = new ArrayList<
Object
>();
int j = 0; // 第一列
Class<?> clazz = null;
while (i <
sheet.getPhysicalNumberOfRows
()) { // 遍历所有的行
row
=
sheet
.getRow(i); // 得到行的索引,从0开始
if (i == 0) {
classPath
=
row
.getCell(0).toString();
i++;
continue;
}
classPath
=
"com.homelink.perform.module.perform.util.PerformanceUtil"
;
if (object == null) {
clazz
=
Class
.forName(classPath);
object
=
clazz
.newInstance();// 实例化对象
}
Field[]
f
=
clazz
.getDeclaredFields(); // 得到对象所有属性
int
cells
=
row
.getPhysicalNumberOfCells(); // 总列
if (j < cells) { // 列小于总列
StringBuffer
sb
=
new
StringBuffer("set");
sb.append(f[j].getName().substring(0, 1).toUpperCase());
sb.append(f[j].getName().substring(1));
String
methodName
=
sb
.toString(); // 根据属性得到方法名字
Method[]
method
=
clazz
.getDeclaredMethods();// 得到该类所有的方法
int
start
=
0
;
while (start < method.length) {
String
metName
=
method
[start].getName(); // 得到方法的名字
if (metName.equals(methodName)) { // 如果方法的名字等于属性值的名字
method[start].setAccessible(true);
cell
=
row
.getCell(j).toString(); // 得到列的值
Class<?>[] cla = method[start].getParameterTypes();// 得到方法的参数类型
method[start].invoke(object,new Object[] { getClassTypeValue(cla[0],cell) }); // 调用set方法
j++; // 下一列
if (j == cells) { // 最后一个遍历完了就相等,对象值set完毕
list.add(object);
i++;// 下一行
object = null;
j = 0;
}
break;// 重新遍历
} else {
start++; //方法的名字不等于属性值的名字
continue;// 继续遍历
}
}//内层while结束
}
}// 外层while结束
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
/**
* 通过class类型获取获取对应类型的值
*
* @param typeClass
* class类型
* @param value
* 值
* @return Object
*/
private static Object getClassTypeValue(Class<?> typeClass, String value) {
if (typeClass == Integer.class) {
if (value.equals("")) {
return 0;
}
value = value.replace(".0", "");
return Integer.parseInt(value);
} else if (typeClass == Short.class) {
if (value.equals("")) {
return 0;
}
return Short.parseShort(value);
} else if (typeClass == Byte.class) {
if (value.equals("")) {
return 0;
}
return Byte.parseByte(value);
} else if (typeClass == Double.class) {
if (value.equals("")) {
return 0;
}
return Double.parseDouble(value);
} else if (typeClass == Boolean.class) {
if (value.equals("")) {
return false;
}
return Boolean.parseBoolean(value);
} else if (typeClass == Float.class) {
if (value.equals("")) {
return 0;
}
return Float.parseFloat(value);
} else if (typeClass == Long.class) {
if (value.equals("")) {
return 0;
}
return Long.parseLong(value);
} else if (typeClass == Date.class) {
return SimpleDateFormatUtil.getInstance().format(value);
} else {
return typeClass.cast(value);
}
}
}