excel数据录入数据库工具

之前客户需要录入excel到数据库,手动录入太麻烦了,于是结合之前学的lambda,自己搞了一个工具

1、主要方法

/**
 * 将excel表对应列,装入实体类对应字段,形成实体类结果集
 * @param path excel表路径
 * @param clazz 对应实体类
 * @param result 结果集
 * @param columns excel读取列,索引从0开始
 * @param fns 对应实体类的lambda表达式,get方法
 */
public static <T> void Excel2EntityList(String path, Class clazz, Collection result, List<Integer> columns, IGetter<T>... fns) {
    try {
        // 获取需要赋值的属性名
        List<String> attributes = new ArrayList<>();
        Arrays.stream(fns).forEach(fn -> {
            SerializedLambda lambda = LambdaUtil.getSerializedLambda(fn);
            String methodName = lambda.getImplMethodName();
            methodName = methodName.replaceFirst("get", "");
            methodName = methodName.substring(0,1).toLowerCase() + methodName.substring(1);
            attributes.add(methodName);
        });
        // 创建对Excel工作簿文件的引用
        Workbook wb = WorkbookFactory.create(new FileInputStream(path));
        // 在Excel文档中,第一张工作表的缺省索引是0
        // 其语句为:XSSFSheet sheet = workbook.getSheetAt(0);
        Sheet sheet = wb.getSheetAt(0);
        if (null != sheet) {
            // 获取到Excel文件中的所有行数
            int rows = sheet.getPhysicalNumberOfRows();
            // 遍历行(由于excel表第一行为对应表字段的列,所以i从1开始)
            for (int i = 1; i < rows; i++) {
                // 读取左上端单元格
                Row row = sheet.getRow(i);
                // 行不为空
                if (row != null) {
                    // 获取一行对应的一个对象实例
                    Object o = clazz.getConstructor().newInstance();
                    AtomicInteger k = new AtomicInteger();
                    // 为对象赋值
                    attributes.stream().forEach(attribute -> {
                        try {
                            Field field = clazz.getDeclaredField(attribute);
                            field.setAccessible(true);
                            Class<?> typeClass = field.getType();
                            String type = field.getGenericType().getTypeName();
                            Method method = clazz.getMethod("set" + attribute.substring(0,1).toUpperCase() + attribute.substring(1), typeClass);
                            if ("java.lang.String".equals(type)) {
                                method.invoke(o, row.getCell(columns.get(k.get())).getStringCellValue());
                            }
                            else if ("java.lang.Float".equals(type)) {
                                method.invoke(o, (float) row.getCell(columns.get(k.get())).getNumericCellValue());
                            }
                            else if ("java.lang.Double".equals(type)) {
                                method.invoke(o, row.getCell(columns.get(k.get())).getNumericCellValue());
                            }
                            else if ("java.lang.Integer".equals(type)) {
                                method.invoke(o, (int) row.getCell(columns.get(k.get())).getNumericCellValue());
                            }
                            k.getAndIncrement();
                            if (columns.size() <= k.get()) {
                                k.set(0);
                            }
                        } catch (Exception e) {
                            System.out.println("参数错误:");
                            System.out.println("实体类属性:" + attribute);
                            System.out.println("excel表第" + k.get() +"列");
                        }
                    });
                    // 将对象装入集合
                    result.add(o);
                }
            }
        }
    }catch (Exception e) {
        e.printStackTrace();
    }
}

2、其他方法

/**
 * 获取函数式接口的SerializedLambda
 */
public static SerializedLambda getSerializedLambda(Serializable fn) {
    SerializedLambda lambda = CLASS_LAMDBA_CACHE.get(fn.getClass());
    if(lambda == null) {
        try {
            Method method = fn.getClass().getDeclaredMethod("writeReplace");
            method.setAccessible(Boolean.TRUE);
            lambda = (SerializedLambda) method.invoke(fn);
            CLASS_LAMDBA_CACHE.put(fn.getClass(), lambda);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    return lambda;
}

/**
 * 测试
 */
public static void main(String[] args) {
    List<Entity> list = new ArrayList<>();
    List<Integer> columns = new ArrayList<>();
    columns.add(0);
    columns.add(2);
    ExcelUtil.Excel2EntityList("D:\\zl\\xxx.xlsx",
            Entity.class,
            list,
            columns,
            Entity::getName, Entity::getAge);
	// list中数据录入数据库
}

3、代码地址:

https://gitee.com/zilong123666/cabinet 一起进步,一起学习

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐