您的位置:首页 > 其它

利用POI读入excel通过反射生成Bean源码实现

2017-02-12 21:36 1041 查看
声明:本文参考了 作者 a javaer  的文章  利用POI读入excel通过反射生成Bean源码实现

在工作中遇到,A将数据写入excel的第三列,而我要获取这一列值,并封装为多个对象存入数据库的情况。这列值有100个左右,我不可能一个个set,想到使用反射来生成对象。

在网上查资料   作者a javer的博客跟我需求相近,做了参考。

按照 作者 a javer的思路 完成了适合自己需求的实现:

  1.创建一个XX.properties文件(key-value),其中key为Excel中列数如1,2,3等,value为Excel中该列数据对应的javabean属性

        2.通过读Excel文件,借助上面的属性文件采用POI所有行的某一列,生成Map<String,Object>结构的数据(key为javabean的属性名,value为excel中对应的值)。

        3.将第二步中的Map<String,Object>结构,通过反射生成对应的Javabean对象。

其中一个实体类:

public class StaCominfo {

private static final long serialVersionUID = 1L;
private String creditScore;
private String creditLevel;
private String interestSuggestions;
private String creditAdvice;
private String creditStatusScore;
private String operateStatusScore;
private String supplyStabilityScore;
private String sovencyScore;
private String relatedRiskScore;
private String litigationInfo;
private String creditAnomaly;
private String companyChange;
private String mediaInfo;
private String penaltyInfo;

}


properties文件格式:

1=creditScore
2=creditLevel
3=interestSuggestions
4=creditAdvice
5=creditStatusScore
6=operateStatusScore
7=supplyStabilityScore
8=sovencyScore
9=relatedRiskScore
10=litigationInfo
11=creditAnomaly
12=companyChange
13=mediaInfo
14=penaltyInfo
大致是100项,包括了4个实体类的属性。

代码实现:

package test;

import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.commons.lang3.StringUtils;

import java.io.FileInputStream;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.ResourceBundle;

/**
* @author ln
* @date 2017/2/10
*/

public class ExcelToBean
{
private static ResourceBundle modelPropertiesBundle ;

static {
//首次加载该类时加载model.properites文件资源
modelPropertiesBundle = ResourceBundle.getBundle("model");
}

/**
* 将workbook中的值放入Map<String,Object>结构中
* @param workbook
* @return
*/
public static Map<String, Object> parseExcel(Workbook workbook){
// 用来存放 excel中所有属性的 属性名和对应值
Map<String, Object> result = new HashMap<String,Object>();
// 取第一个sheet页
HSSFSheet sheet = (HSSFSheet) workbook.getSheetAt(0);
int excleRowNum = sheet.getLastRowNum()+1;  // 获取总行数
String [] columnName = new String [excleRowNum]; //相应的javabean类的属性名称数组
for(int i=0;i<columnName.length;i++){    //从资源文件中获取
if(modelPropertiesBundle.containsKey((String.valueOf(i+1)))){
columnName[i] = modelPropertiesBundle.getString(String.valueOf(i+1));
}
}

for(int rowIndex=0;rowIndex <sheet.getPhysicalNumberOfRows();rowIndex++){   //row
HSSFRow row = sheet.getRow(rowIndex);
HSSFCell cell = row.getCell(2);  //第三列数据   所有行的第三列数据均为属性值
if(rowIndex <= columnName.length && columnName[rowIndex]!=null && columnName[rowIndex].trim().length()>0){ //该列值在对应的java对象中有值
//取出当前cell的值和对应Javabean类的属性放入到map中
result.put(columnName[rowIndex].trim(), getCellValue(cell));
}
}
return result;
}

/**
* 利用反射将    Map<String,Object>结构 生成相应的 T 对象
* @param map
* @param clazz
* @param <T>
* @return
* @throws Exception
*/
public static <T> T toObject(Map<String, Object> map, Class<T> clazz) throws Exception{
T obj= clazz.newInstance();
Method[] methods = clazz.getDeclaredMethods();
for(Method m:methods){
if(m.getName().startsWith("set")){      //找到setter方法
String str = m.getName().substring(3);    // 该setter方法对应的属性名 首字母为大写
String attribute = StringUtils.uncapitalize(str);
String value = (String)map.get(attribute);  // 从map中取出对应属性的值
if(value != null){
m.invoke(obj, value);
}
}
}
return obj;
}

/**
* 获取当前单元格内容
* @param cell
* @return
*/
private static String getCellValue(Cell cell){
String value = "";
if(cell!=null){
switch (cell.getCellType()) {

default :
// 数据均以excel样式为准
HSSFDataFormatter dataFormatter = new HSSFDataFormatter();
value  = dataFormatter.formatCellValue(cell).toString();
break;
}
}
return value;
}

public static void main(String args[]) throws Exception{
FileInputStream input = new FileInputStream("C:\\Users\\Administrator\\Desktop\\CreditReportData.xls");
HSSFWorkbook workbook = new HSSFWorkbook(input);

Map<String, Object> map =  parseExcel(workbook);

StaCominfo staCominfo=  toObject(map, StaCominfo.class);

}

}


这里是将excel中  StaCominfo的属性对应的值赋值给对象 staCominfo,可以在调用 toObject()方法,完成对其他实体类的赋值

excel格式:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  excel poi 反射
相关文章推荐