java利用反射通用导入Excel到数据库

本文介绍了一个用于导入 Excel xlsx 文件的 Java 工具类。该工具能够读取指定路径下的 xlsx 文件,并将数据封装到 Java 对象中。通过对 Excel 文件中的数据进行解析,映射到特定类的对象属性上。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.homelink.perform.module.perform.util;
 
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 
/**
 * 导入Excel xlsx 2007工具类
 *
 * @author fangxiaowen
 * @date 2013-07-11
 */
public final class ExcelReader {
 
    /**
     * 私有构造 保证该类不能被实例化
     */
    private ExcelReader() {
    }
 
    /**
     * 把Excel中的数据封装在结果集中
     * @param 要导入的文件的路径
     * @return java.util.List<Object>
     */
    public static List<Object> excelReader(String path) {
        List<Object> list = null;
        try {
            XSSFWorkbook xs = new XSSFWorkbook(path);
 
            XSSFSheet sheet = xs.getSheetAt(0); // 读取第一章表格内容
 
            String classPath = null; // sheet的名字就是类路径
            XSSFRow row; // 定义 row
            String cell; // 定义 cell
            Object object = null;
 
            int i = 0; // 从第二行开始取数据
            list = new ArrayList<Object>();
            int j = 0; // 第一列
            Class<?> clazz = null;
            while (i < sheet.getPhysicalNumberOfRows()) { // 遍历所有的行
 
                row = sheet.getRow(i); // 得到行的索引,从0开始
                if (i == 0) {
                    classPath = row.getCell(0).toString();
                    i++;
                    continue;
                }
                classPath = "com.homelink.perform.module.perform.util.PerformanceUtil";
                if (object == null) {
                    clazz = Class.forName(classPath);
                    object = clazz.newInstance();// 实例化对象                  
                }
                Field[] f = clazz.getDeclaredFields(); // 得到对象所有属性
                int cells = row.getPhysicalNumberOfCells(); // 总列
                if (j < cells) { // 列小于总列
                    StringBuffer sb = new StringBuffer("set");
                    sb.append(f[j].getName().substring(0, 1).toUpperCase());
                    sb.append(f[j].getName().substring(1));
                    String methodName = sb.toString(); // 根据属性得到方法名字
                    Method[] method = clazz.getDeclaredMethods();// 得到该类所有的方法
                    int start = 0;
                    while (start < method.length) {
                        String metName = method[start].getName(); // 得到方法的名字
                        if (metName.equals(methodName)) { // 如果方法的名字等于属性值的名字
                            method[start].setAccessible(true);
                            cell = row.getCell(j).toString(); // 得到列的值
                            Class<?>[] cla = method[start].getParameterTypes();// 得到方法的参数类型
                            method[start].invoke(object,new Object[] { getClassTypeValue(cla[0],cell) }); // 调用set方法
                            j++; // 下一列
                            if (j == cells) { // 最后一个遍历完了就相等,对象值set完毕
                                list.add(object);
                                i++;// 下一行
                                object = null;
                                j = 0;
                            }
                            break;// 重新遍历
                        } else {
                            start++; //方法的名字不等于属性值的名字
                            continue;// 继续遍历
                        }
                    }//内层while结束
                }
 
            }// 外层while结束
        } catch (Exception e) {
            e.printStackTrace();
        }
        return list;
    }
 
    /**
     * 通过class类型获取获取对应类型的值
     *
     * @param typeClass
     *            class类型
     * @param value
     *            值
     * @return Object
     */
    private static Object getClassTypeValue(Class<?> typeClass, String value) {
        if (typeClass == Integer.class) {
            if (value.equals("")) {
                return 0;
            }
            value = value.replace(".0", "");
            return Integer.parseInt(value);
        } else if (typeClass == Short.class) {
            if (value.equals("")) {
                return 0;
            }
            return Short.parseShort(value);
        } else if (typeClass == Byte.class) {
            if (value.equals("")) {
                return 0;
            }
            return Byte.parseByte(value);
        } else if (typeClass == Double.class) {
            if (value.equals("")) {
                return 0;
            }
            return Double.parseDouble(value);
        } else if (typeClass == Boolean.class) {
            if (value.equals("")) {
                return false;
            }
            return Boolean.parseBoolean(value);
        } else if (typeClass == Float.class) {
            if (value.equals("")) {
                return 0;
            }
            return Float.parseFloat(value);
        } else if (typeClass == Long.class) {
            if (value.equals("")) {
                return 0;
            }
            return Long.parseLong(value);
        } else if (typeClass == Date.class) {
            return SimpleDateFormatUtil.getInstance().format(value);
        } else {
            return typeClass.cast(value);
        }
    }
 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值