91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

基于 POI 封裝 ExcelUtil 精簡的 Excel 導入導出

發布時間:2020-08-03 23:10:35 來源:網絡 閱讀:344 作者:cyzshenzhen 欄目:編程語言

基于 POI 封裝 ExcelUtil 精簡的 Excel 導入導出

本文是使用 org.apache.poi 進行一次簡單的封裝,適用于大部分 excel 導入導出功能。過程中可能會用到反射,如若有對于性能有極致強迫癥的同學,看看就好。

由于 poi 本身只是針對于 excel 等office軟件的一個工具包,在一些常規的 excel 導入導出時,還需要再做一次精簡的封裝,簡化代碼耦合。

一、現狀

本人經歷過幾家公司的代碼封裝,導入導出一般存在下面的情況。

1.1 導入

  1. 傳入文件地址,返回 Sheet 對象,在業務代碼中進行循環遍歷,做相對應的類型轉換,業務處理(二零零幾年的代碼框架)
  2. 傳入文件地址,返回 List<String, Object> 的對象,外部直接做強轉
  3. 傳入文件地址,返回 List<String, String> 的對象,外部將字符串對象轉換為對應的類型

總結:如果只有上述的選擇,本人是比較傾向于第二種,畢竟對外層是非常友好的

1.2 導出

  1. 直接在邏輯代碼中進行遍歷封裝sheet,傳入到生成file的方法中(二零零幾年的代碼框架)
  2. 先循環遍歷 List<Model> 對象,轉換為 List<Map<String, String>> 對象,帶上 fieldName 傳入到封裝好excel生成的方法中,內部則使用 map.get() 方法操作
  3. 直接將 List<Model> 對象帶上 fieldName 傳入到封裝好excel生成的方法中,內部將 Model 對象轉換為 JSONObject,然后使用 jsonObj.get() 方法操作
  4. 先將 List<Model> 轉換為 JSONArray ,帶上 fieldName 傳入到封裝好excel生成的方法中,內部將 Model 對象轉換為 JSONObject,然后使用 jsonObj.get() 方法操作。(使用這種做法,據分析應該是為了執行 jsonConfig.registerJsonValueProcessor(Date.class, new JsonDateValueProcessor("yyyy-MM-dd HH:mm:ss")); 這行代碼,可能是為了解決日期類型格式問題)

總結:如果只有上述的選擇,本人是比較傾向于第三種,第三種只遍歷一次,并且外部未做處理。但是按第四種模式來看,那么第三種模式還是會存在日期格式問題,這個我們后續再分析如何處理。

二、導入

2.1 方法定義

/**
* excel導入
* @param keys       字段名稱數組,如  ["id", "name", ... ]
* @param filePath   文件物理地址
* @return 
* @author yzChen
* @date 2016年12月18日 下午2:46:51
*/
public static List<Map<String, Object>> imp(String filePath, String[] keys)
    throws Exception {}

2.2 循環處理模塊

// 遍歷該行所有列
for (short j = 0; j < cols; j++) {
    cell = row.getCell(j);
    if(null == cell) continue;  // 為空時,下一列

    // 根據poi返回的類型,做相應的get處理
    if(Cell.CELL_TYPE_STRING == cell.getCellType()) {
        value = cell.getStringCellValue();
    } else if(Cell.CELL_TYPE_NUMERIC == cell.getCellType()) {
        value = cell.getNumericCellValue();

        // 由于日期類型格式也被認為是數值型,此處判斷是否是日期的格式,若時,則讀取為日期類型
        if(cell.getCellStyle().getDataFormat() > 0)  {
            value = cell.getDateCellValue();
        }
    } else if(Cell.CELL_TYPE_BOOLEAN == cell.getCellType()) {
        value = cell.getBooleanCellValue();
    } else if(Cell.CELL_TYPE_BLANK == cell.getCellType()) {
        value = cell.getDateCellValue();
    } else {
        throw new Exception("At row: %s, col: %s, can not discriminate type!");
    }

    map.put(keys[j], value);
}

2.3 使用

String filePath = "E:/order.xls";
String[] keys = new String[]{"id","brand"};

List<Map<String, Object>> impList;
try {
    impList = ExcelUtil.imp(filePath, keys);

    for (Map<String, Object> map : impList) {
        System.out.println(map.get("brand"));
    }
} catch (Exception e) {
    e.printStackTrace();
}

2.4 分析

  1. 入口只需要傳入文件名稱,以及外部需要讀取的key即可
  2. 內部處理,則針對 數值型、日期類型、字符串 類型已經做了對應處理,外部則直接進行強轉對應的類型即可

三、導出

3.1 方法定義

/**
* excel導出
* @param fileNamePath   導出的文件名稱
* @param sheetName  導出的sheet名稱
* @param list       數據集合
* @param titles     第一行表頭
* @param fieldNames 字段名稱數組
* @return
* @throws Exception    
* @author yzChen
* @date 2017年5月6日 下午3:53:47
*/
public static <T> File export(String fileNamePath, String sheetName, 
    List<T> list, String[] titles, String[] fieldNames) throws Exception {}

3.2 循環處理模塊

// 遍歷生成數據行,通過反射獲取字段的get方法
for (int i = 0; i < list.size(); i++) {
    t = list.get(i);
    HSSFRow row = sheet.createRow(i+1);
    Class<? extends Object> clazz = t.getClass();
    for(int j = 0; j < fieldNames.length; j++){
        methodName = "get" + capitalize(fieldNames[j]);
        try {
            method = clazz.getDeclaredMethod(methodName);
        } catch (java.lang.NoSuchMethodException e) {   //  不存在該方法,查看父類是否存在。此處只支持一級父類,若想支持更多,建議使用while循環
            if(null != clazz.getSuperclass()) {
                method = clazz.getSuperclass().getDeclaredMethod(methodName);
            }
        }
        if(null == method) {
            throw new Exception(clazz.getName() + " don't have menthod --> " + methodName);
        }
        ret = null == method.invoke(t) ? null : method.invoke(t) + "";
        setCellGBKValue(row.createCell(j), ret + "");
    }
}

3.3 使用

String[] titles = new String[]{"Id", "Brand"};
String[] fieldNames = new String[]{"id", "brand"};
List<Order> expList = new ArrayList<Order>();
Order order = new Order();
order.setId(1L);
order.setBrand("第三方手動閥");
expList.add(order);
order = new Order();
order.setId(2L);
order.setBrand("scsdsad");
expList.add(order);

String fileNamePath = "E:/order.xls";
try {
    ExcelUtil.export(fileNamePath, "訂單", expList, titles, fieldNames);
} catch (Exception e) {
    e.printStackTrace();
}

3.4 總結

  1. 入口主要是需要傳入 List<Model> 數據集合,以及 fieldNames 字段名稱
  2. 內部處理,是直接通過反射獲得 get 方法的返回值,進行強轉為字符串進行導出
  3. 為了兼容繼承父類的一些共有字段的設計,則加上了一層父類的方法讀取

四、關于日期類型導出處理

1.1 日期字段導出指定格式內容

  1. 建議在 Model 類中,新增一個擴展字段,并封裝一個 get 方法,內容則只是對原字段進行轉換,導出時,fieldName 則傳遞擴展字段即可。如 createTime,示例如下:
private Date createTime;
private String createTimeStr;   // 擴展字段

public Date getCreateTime() {
    return createTime;
}

public void setCreateTime(Date createTime) {
    this.createTime = createTime;
}

public String getCreateTimeStr() {
    createTimeStr = DateUtil.formatDatetime(this.createTime);
    return createTimeStr;
}

五、Demo下載

GJP-Example-ExcelUtil 代碼下載

My Blog

blog.guijianpan.com

技術交流

基于 POI 封裝 ExcelUtil 精簡的 Excel 導入導出

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

尚义县| 高邑县| 新疆| 襄樊市| 定兴县| 曲沃县| 开鲁县| 台东县| 福泉市| 霞浦县| 互助| 搜索| 绥德县| 湖南省| 平利县| 金坛市| 岳阳市| 门头沟区| 毕节市| 通化县| 古丈县| 冕宁县| 深州市| 杨浦区| 靖宇县| 井冈山市| 彭山县| 铜梁县| 娄底市| 大冶市| 宿州市| 邹城市| 广饶县| 印江| 玉门市| 梓潼县| 临沭县| 江源县| 黄大仙区| 揭西县| 深泽县|