利用POI读入excel通过反射生成Bean源码实现
来源:互联网 发布:测试网络信号的仪器 编辑:程序博客网 时间:2024/05/09 12:49
声明:本文参考了 作者 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=creditScore2=creditLevel3=interestSuggestions4=creditAdvice5=creditStatusScore6=operateStatusScore7=supplyStabilityScore8=sovencyScore9=relatedRiskScore10=litigationInfo11=creditAnomaly12=companyChange13=mediaInfo14=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格式:
0 0
- 利用POI读入excel通过反射生成Bean源码实现
- 利用POI生成Excel并通过Servlet下载示例
- 利用Java反射机制和POI实现导出Excel功能
- 利用Java反射机制和POI实现导出Excel功能
- java利用POI操作EXCEL(基于反射)
- poi 实现 java生成excel
- POI实现生成excel文件
- Java利用POI生成Excel强制换行
- 利用spring的poi生成Excel
- java利用poi生成excel报表
- 利用poi 生成多个excel sheet
- Java利用POI生成Excel强制换行
- Java利用POI生成Excel强制换行
- Java利用POI生成Excel强制换行
- Java利用POI生成Excel强制换行
- java利用POI和反射解析EXCEL实现对象属性动态赋值
- 教你如何利用POI和JFreeChart框架实现生成Excel文件(生成 统计图)
- 教你如何利用POI和JFreeChart框架实现生成Excel文件(生成 统计图)
- Java编程题练习2017-02-12
- 进程池 Pool
- 音频编码 -(1)音频编码基本原理简介
- 算法——从时间复杂度开始说起
- CCNA 6STP和ETHERCHANEL
- 利用POI读入excel通过反射生成Bean源码实现
- Object-C 记录
- 算法训练 P1103
- Windows下为mongodb注册service
- 蓝桥杯入门训练 序列求和
- jdk jre jvm概念
- python的进程锁
- Unity3d射线的原理用法以及一个利用射线实现简单拾取的小例子
- XCode 使用记录