概述
使用POI读取Excel中的数据,使用Java反射将数据映射到实体中,有一个不好的地方是就是表头的第一行需要定义为属性名,还没有想到如何解决,先这样把
来看,思路
首先将表头存在一个List中,在读数据的时候,获取相应的列的数据,用反射注入到实体中,在加到List中返回即可
Excel解析类
目前仅针对,String类型的类,进行了操作,其他类型尚没有写,优化也尚未进行
//对一张表,进行实体映射
private static <T> List<T> readExcel(Class<T> classzz,Workbook workbook) throws Exception {
Sheet sheet = workbook.getSheetAt(0);
//获取最后一行
int lastRowNum = sheet.getLastRowNum()+1;
//获取最后一列
int lastCellNum = sheet.getRow(0).getLastCellNum();
//获取实体类字段
Field[] fields = classzz.getDeclaredFields();
Row row = null;
List<String> headList = new ArrayList<>();
//一行存为一个Obj,放在List中
List<T> beans = new ArrayList<T>();
//获取表头放在list中
for (int j=0;j<lastCellNum;j++){
row = sheet.getRow(0);
Cell cell = row.getCell(j);
//均格式化为字符串
DataFormatter formatter = new DataFormatter();
String value = formatter.formatCellValue(cell);
headList.add(value);
}
for (int i=1;i<lastRowNum;i++){
//通过class创建实体对象
T instance = classzz.newInstance();
for (int j=0;j<lastCellNum;j++){
row = sheet.getRow(i);
Cell cell = row.getCell(j);
DataFormatter formatter = new DataFormatter();
String value = formatter.formatCellValue(cell);
String headName = headList.get(j);
for (Field field : fields){
if (headName.equalsIgnoreCase(field.getName())){
String methodName = MethodUtils.setMethodName(field.getName());
Method method = classzz.getMethod(methodName,field.getType());
//注入值
method.invoke(instance,value);
}
}
}
beans.add(instance);
}
return beans;
}
//内部静态类
static class MethodUtils {
private static final String SET_PREFIX = "set";
private static final String GET_PREFIX = "get";
private static String capitalize(String name) {
if (name == null || name.length() == 0) {
return name;
}
//set+首字母大写 比如setSid
return name.substring(0, 1).toUpperCase() + name.substring(1);
}
public static String setMethodName(String propertyName) {
return SET_PREFIX + capitalize(propertyName);
}
public static String getMethodName(String propertyName) {
return GET_PREFIX + capitalize(propertyName);
}
}
pom
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.9</version>
</dependency>