利用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对象。
其中一个实体类:
properties文件格式:
代码实现:
这里是将excel中 StaCominfo的属性对应的值赋值给对象 staCominfo,可以在调用 toObject()方法,完成对其他实体类的赋值
excel格式:
在工作中遇到,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格式:
相关文章推荐
- 利用Java针对MySql封装的jdbc框架类 JdbcUtils 完整实现(包含增删改查、JavaBean反射原理,附源码)
- 利用POI生成Excel并通过Servlet下载示例
- 利用Java针对MySql封装的jdbc框架类 JdbcUtils 完整实现(包含增删改查、JavaBean反射原理,附源码)
- 利用Java针对MySql封装的jdbc框架类 JdbcUtils 完整实现(包含增删改查、JavaBean反射原理,附源码)
- java反射获取实体类的属性名和值通过POI导出EXCEl,并实现表格列宽度自适应
- 通过poi的XSSF实现生成excel文件
- Excel基于POI利用反射返回Bean导入、Excel基于POI导出、Excel利用jxls导出、Excel模板导出
- 利用Java针对MySql封装的jdbc框架类 JdbcUtils 完整实现(包含增删改查、JavaBean反射原理,附源码)
- 利用POI生成Excel并通过Servlet下载示例
- 利用Java针对MySql封装的jdbc框架类 JdbcUtils 完整实现(包含增删改查、JavaBean反射原理,附源码)
- 利用Java针对MySql封装的jdbc框架类 JdbcUtils 完整实现(包含增删改查、JavaBean反射原理,附源码)
- 实现poi方式生成excel文件和web类根据路径生成java实例的反射技术的springmvc方法的方法
- 利用 LotusScript 实现用 Lotus Domino 的数据生成图形化的 Excel 报表
- 利用spring的poi生成Excel
- poi 实现 java生成excel
- 利用 LotusScript 实现用 Lotus Domino 的数据生成图形化的 Excel 报表
- 利用反射与dom4j读取javabean生成对应XML和读取XML得到对应的javabean对象集合
- Android系统原理与源码分析(1):利用Java反射技术阻止通过按钮关闭对话框
- Android系统原理与源码分析(1):利用Java反射技术阻止通过按钮关闭对话框
- poi实现根据excel模板,生成excel并导入数据