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

声明:本文参考了 作者 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格式:



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值