利用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
原创粉丝点击