导入excel文件转换为JavaBean和Map的方法

在解决了excel兼容性问题之后, 终于可以开始制作这个小工具了, 这个工具主要是用来通过excel文件获得JavaBean对象和Map映射的.
先说简单的, 转换map

    public static List<Map<String,Object>> importExcel(InputStream in) throws Exception {
        List<Map<String,Object>> mapList = new ArrayList<Map<String,Object>>();
        Workbook workbook = WorkbookFactory.create(in);
        Sheet sheet = workbook.getSheetAt(0);
        Row row = sheet.getRow(0);
        List<String> keys = new ArrayList<String>();
        for(int i = 0; i < row.getLastCellNum(); i++){
            Cell cell = row.getCell(i);
            keys.add(String.valueOf(getValue(cell)));
        }
        
        for(int i = 0; i < sheet.getLastRowNum(); i++){
            Row currentRow = sheet.getRow(i + 1);
            Map<String, Object> map = new HashMap<String, Object>();
            for(int j = 0; j < currentRow.getLastCellNum(); j++){
                map.put(keys.get(j), getValue(currentRow.getCell(j)));
            }
            mapList.add(map);
        }
        return mapList;
    }

代码比较简单, 不多解释, 为了让excel单元格取值简单, 封装了一个getValue方法, 代码中有一些过期的方法, 但是没关系... 也有点懒不想找替代方法了

private static Object getValue(Cell cell) {
        if (cell.getCellType() == Cell.CELL_TYPE_BOOLEAN) {
            return cell.getBooleanCellValue();
        } else if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {
            return cell.getNumericCellValue();
        } else {
            return String.valueOf(cell.getStringCellValue());
        }
    }

接着是转换成JavaBean的方法

    public static <T> List<T> importExcel(InputStream in, Class<T> c) throws Exception {
        List<T> list = new ArrayList<T>();
        Workbook workbook = WorkbookFactory.create(in);
        Sheet sheet = workbook.getSheetAt(0);
        Row row = sheet.getRow(0);
        List<String> keys = new ArrayList<String>();
        for(int i = 0; i < row.getLastCellNum(); i++){
            Cell cell = row.getCell(i);
            keys.add(getValue(cell));
        }
        
        for(int i = 0; i < sheet.getLastRowNum(); i++){
            Row currentRow = sheet.getRow(i + 1);
            Map<String, String> map = new HashMap<String, String>();
            for(int j = 0; j < currentRow.getLastCellNum(); j++){
                map.put(keys.get(j), getValue(currentRow.getCell(j)));
            }
            T t = mapToObject(c,map);
            list.add(t);
        }
        
        return list;
    }

总体上和转换map的代码差不多, 逻辑是一样的, 为了装逼用了泛型, 关键是map和javabean的转换, 用了一个mapToObject的方法

    private static <T> T mapToObject(Class<T> c,Map<String, Object> map) throws Exception {
        BeanInfo beanInfo = Introspector.getBeanInfo(c);
        T t = c.newInstance();
        PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
        for(int i = 0; i < propertyDescriptors.length; i++){
            PropertyDescriptor descriptor = propertyDescriptors[i];
            String propertyName = descriptor.getName();
            if(map.containsKey(propertyName)){
                Object value = map.get(propertyName);
                Object[] args = new Object[1];
                args[0] = value;
                //这里捕获异常为了让不正常的值可以暂时跳过不影响正常字段的赋值
                try {
                    descriptor.getWriteMethod().invoke(t, args);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (IllegalArgumentException e) {
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    e.printStackTrace();
                }
            }
        }
        return t;
    }

以上代码不是很严谨, 希望看到问题的能交流一下, 也欢迎大家提问.

参考资料
http://poi.apache.org/apidocs/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,742评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,854评论 18 139
  • 2017年,是特别难熬的一年,这一年面临太多的事情,尤其是事业身体的无奈,让自己身心疲惫,出来混终究是要还的,有些...
    卡米麻阅读 401评论 0 0
  • 《十五次约练——学而时习之》 昨晚听课后,越来越觉得刘老师厉害:焦点问句从他嘴里说出来要多自然有多自然...
    涓涓细流_7589阅读 157评论 0 1
  • 昨天夜里,准备入眠的时候手机跟以往传来了滴滴的声音,索性翻开来看,是一个刚认识的朋友发来的,说她心情不开心,想她男...
    孙雨浓阅读 341评论 0 0