導(dǎo)入excel文件轉(zhuǎn)換為JavaBean和Map的方法

在解決了excel兼容性問題之后, 終于可以開始制作這個(gè)小工具了, 這個(gè)工具主要是用來通過excel文件獲得JavaBean對象和Map映射的.
先說簡單的, 轉(zhuǎn)換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單元格取值簡單, 封裝了一個(gè)getValue方法, 代碼中有一些過期的方法, 但是沒關(guān)系... 也有點(diǎn)懶不想找替代方法了

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());
        }
    }

接著是轉(zhuǎn)換成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;
    }

總體上和轉(zhuǎn)換map的代碼差不多, 邏輯是一樣的, 為了裝逼用了泛型, 關(guān)鍵是map和javabean的轉(zhuǎn)換, 用了一個(gè)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;
                //這里捕獲異常為了讓不正常的值可以暫時(shí)跳過不影響正常字段的賦值
                try {
                    descriptor.getWriteMethod().invoke(t, args);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (IllegalArgumentException e) {
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    e.printStackTrace();
                }
            }
        }
        return t;
    }

以上代碼不是很嚴(yán)謹(jǐn), 希望看到問題的能交流一下, 也歡迎大家提問.

參考資料
http://poi.apache.org/apidocs/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,706評論 18 399
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,568評論 19 139
  • 2017年,是特別難熬的一年,這一年面臨太多的事情,尤其是事業(yè)身體的無奈,讓自己身心疲憊,出來混終究是要還的,有些...
    卡米麻閱讀 498評論 0 0
  • 《十五次約練——學(xué)而時(shí)習(xí)之》 昨晚聽課后,越來越覺得劉老師厲害:焦點(diǎn)問句從他嘴里說出來要多自然有多自然...
    涓涓細(xì)流_7589閱讀 228評論 0 1
  • 昨天夜里,準(zhǔn)備入眠的時(shí)候手機(jī)跟以往傳來了滴滴的聲音,索性翻開來看,是一個(gè)剛認(rèn)識的朋友發(fā)來的,說她心情不開心,想她男...
    孫雨濃閱讀 394評論 0 0

友情鏈接更多精彩內(nèi)容