zoukankan      html  css  js  c++  java
  • Excel转JAVA集合对象

    package com.ccbpay.cloud.util;

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.math.BigDecimal;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.ss.usermodel.Cell;
    import org.apache.poi.ss.usermodel.Row;
    import org.apache.poi.ss.usermodel.Sheet;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;

    import java.lang.reflect.Field;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;

    /**
    * 功能: [POI实现把Excel数据导入到数据库]
    * 作者: JML
    * 版本: 1.0
    */
    public class ImportExcel{

    //正则表达式 用于匹配属性的第一个字母
    private static final String REGEX = "[a-zA-Z]";

    /**
    * 功能: Excel数据导入到数据库
    * 参数: originUrl[Excel表的所在路径]
    * 参数: startRow[从第几行开始]
    * 参数: endRow[到第几行结束
    * (0表示所有行;
    * 正数表示到第几行结束;
    * 负数表示到倒数第几行结束)]
    * 参数: clazz[要返回的对象集合的类型]
    */
    public static List<?> importExcel(String originUrl,int startRow,int endRow,Class<?> clazz) throws IOException {
    //是否打印提示信息
    boolean showInfo=true;
    return doImportExcel(originUrl,startRow,endRow,showInfo,clazz);
    }

    /**
    * 功能:真正实现导入
    */
    private static List<Object> doImportExcel(String originUrl,int startRow,int endRow,boolean showInfo,Class<?> clazz) throws IOException {
    // 判断文件是否存在
    File file = new File(originUrl);
    if (!file.exists()) {
    throw new IOException("文件名为" + file.getName() + "Excel文件不存在!");
    }
    XSSFWorkbook wb = null;
    FileInputStream fis=null;
    List<Row> rowList = new ArrayList<Row>();
    try {
    fis = new FileInputStream(file);
    // 去读Excel
    wb = new XSSFWorkbook(fis);
    Sheet sheet = wb.getSheetAt(0);
    // 获取最后行号
    int lastRowNum = sheet.getLastRowNum();
    if (lastRowNum > 0) { // 如果>0,表示有数据
    out(" 开始读取名为【" + sheet.getSheetName() + "】的内容:",showInfo);
    }
    Row row = null;
    // 循环读取
    for (int i = startRow; i <= lastRowNum + endRow; i++) {
    row = sheet.getRow(i);

    if (row != null) {
    rowList.add(row);
    out("第" + (i + 1) + "行:",showInfo,false);
    // 获取每一单元格的值
    for (int j = 0; j < row.getLastCellNum(); j++) {
    String value = getCellValue(row.getCell(j));
    if (!value.equals("")) {
    out(value + " | ",showInfo,false);
    }
    }
    out("",showInfo);
    }
    }
    } catch (IOException e) {
    e.printStackTrace();
    } finally{
    wb.close();
    }
    return returnObjectList(rowList,clazz);
    }

    /**
    * 功能:获取单元格的值
    */
    private static String getCellValue(Cell cell) {
    Object result = "";
    if (cell != null) {
    switch (cell.getCellType()) {
    case Cell.CELL_TYPE_STRING:
    result = cell.getStringCellValue();
    break;
    case Cell.CELL_TYPE_NUMERIC:
    result = cell.getNumericCellValue();
    break;
    case Cell.CELL_TYPE_BOOLEAN:
    result = cell.getBooleanCellValue();
    break;
    case Cell.CELL_TYPE_FORMULA:
    result = cell.getCellFormula();
    break;
    case Cell.CELL_TYPE_ERROR:
    result = cell.getErrorCellValue();
    break;
    case Cell.CELL_TYPE_BLANK:
    break;
    default:
    break;
    }
    }
    return result.toString();
    }

    /**
    * 功能:返回指定的对象集合
    */
    private static List<Object> returnObjectList(List<Row> rowList,Class<?> clazz) {
    List<Object> objectList=null;
    Object obj=null;
    String attribute=null;
    String value=null;
    int j=0;
    try {
    objectList=new ArrayList<Object>();
    Field[] declaredFields = clazz.getDeclaredFields();
    for (Row row : rowList) {
    j=0;
    obj = clazz.newInstance();
    for (Field field : declaredFields) {
    attribute=field.getName().toString();
    value = getCellValue(row.getCell(j));
    if(value!="") {
    setAttrributeValue(obj, attribute, value);
    }
    j++;
    }
    objectList.add(obj);
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    return objectList;
    }

    /**
    * 功能:给指定对象的指定属性赋值
    */
    private static void setAttrributeValue(Object obj,String attribute,String value) {
    //得到该属性的set方法名
    String method_name = convertToMethodName(attribute,obj.getClass(),true);
    Method[] methods = obj.getClass().getMethods();
    for (Method method : methods) {
    /**
    * 因为这里只是调用bean中属性的set方法,属性名称不能重复
    * 所以set方法也不会重复,所以就直接用方法名称去锁定一个方法
    * (注:在java中,锁定一个方法的条件是方法名及参数)
    */
    if(method.getName().equals(method_name))
    {
    Class<?>[] parameterC = method.getParameterTypes();
    try {
    /**如果是(整型,浮点型,布尔型,字节型,时间类型),
    * 按照各自的规则把value值转换成各自的类型
    * 否则一律按类型强制转换(比如:String类型)
    */
    if(parameterC[0] == int.class || parameterC[0]==java.lang.Integer.class)
    {
    method.invoke(obj,Integer.valueOf(value));
    break;
    }else if(parameterC[0] == float.class || parameterC[0]==java.lang.Float.class){
    method.invoke(obj, Float.valueOf(value));
    break;
    }else if(parameterC[0] == double.class || parameterC[0]==java.lang.Double.class)
    {
    method.invoke(obj, Double.valueOf(value));
    break;
    }else if(parameterC[0] == byte.class || parameterC[0]==java.lang.Byte.class)
    {
    method.invoke(obj, Byte.valueOf(value));
    break;
    }else if(parameterC[0] == boolean.class|| parameterC[0]==java.lang.Boolean.class)
    {
    method.invoke(obj, Boolean.valueOf(value));
    break;
    }else if(parameterC[0] == java.util.Date.class)
    {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Date date=null;
    try {
    date=sdf.parse(value);
    } catch (Exception e) {
    e.printStackTrace();
    }
    method.invoke(obj,date);
    break;
    }else if(parameterC[0] == BigDecimal.class)
    {
    method.invoke(obj,new BigDecimal(value));
    break;
    }
    else
    {
    method.invoke(obj,parameterC[0].cast(value));
    break;
    }
    } catch (IllegalArgumentException e) {
    e.printStackTrace();
    } catch (IllegalAccessException e) {
    e.printStackTrace();
    } catch (InvocationTargetException e) {
    e.printStackTrace();
    } catch (SecurityException e) {
    e.printStackTrace();
    }
    }
    }
    }

    /**
    * 功能:根据属性生成对应的set/get方法
    */
    private static String convertToMethodName(String attribute,Class<?> objClass,boolean isSet) {
    /** 通过正则表达式来匹配第一个字符 **/
    Pattern p = Pattern.compile(REGEX);
    Matcher m = p.matcher(attribute);
    StringBuilder sb = new StringBuilder();
    /** 如果是set方法名称 **/
    if(isSet)
    {
    sb.append("set");
    }else{
    /** get方法名称 **/
    try {
    Field attributeField = objClass.getDeclaredField(attribute);
    /** 如果类型为boolean **/
    if(attributeField.getType() == boolean.class||attributeField.getType() == Boolean.class)
    {
    sb.append("is");
    }else
    {
    sb.append("get");
    }
    } catch (SecurityException e) {
    e.printStackTrace();
    } catch (NoSuchFieldException e) {
    e.printStackTrace();
    }
    }
    /** 针对以下划线开头的属性 **/
    if(attribute.charAt(0)!='_' && m.find())
    {
    sb.append(m.replaceFirst(m.group().toUpperCase()));
    }else{
    sb.append(attribute);
    }
    return sb.toString();
    }

    /**
    * 功能:输出提示信息(普通信息打印)
    */
    private static void out(String info, boolean showInfo) {
    if (showInfo) {
    System.out.print(info + (showInfo ? " " : ""));
    }
    }

    /**
    * 功能:输出提示信息(同一行的不同单元格信息打印)
    */
    private static void out(String info, boolean showInfo, boolean nextLine) {
    if (showInfo) {
    if(nextLine)
    {
    System.out.print(info + (showInfo ? " " : ""));
    }else
    {
    System.out.print( info );
    }
    }
    }

    }

    //使用 2,0 标识前两行不读
    List<CcbStatementDTO> list = (List<CcbStatementDTO>) ImportExcel.importExcel(CcbpassConfig.ibs_download + excelName, 2, 0, CcbStatementDTO.class);



  • 相关阅读:
    UVA11300分金币
    hdu3987 最小割边数
    直线上的整点个数
    BZOJ 2818 Gcd
    服务器数据恢复成功案例+服务器数据恢复通用原理
    【转】Linux AIO机制
    如何更好地与人沟通?看完这本书,你也能成为沟通高手!
    “自我管理”是成功人士必备的能力,提高自我管理能力推荐你看这些书!
    能帮你提高沟通能力的十沟通类书籍推荐
    团队管理者必看的书籍推荐,团队管理的良方都在这本书里
  • 原文地址:https://www.cnblogs.com/chenweida/p/12119485.html
Copyright © 2011-2022 走看看