天天看點

EasyPoi簡單實作上傳csv檔案以及自定義初步資料處理EasyPoi簡單實作上傳csv檔案以及自定義初步資料處理

EasyPoi簡單實作上傳csv檔案以及自定義初步資料處理

自己準備開發的項目中需要實作檔案上傳功能,發現有EasyPoi和EasyExcel兩大基于Apache Poi的架構實作的導入Excel架構,然後選擇了開發文檔相較于比較具體的EasyPoi進行開發,實際在畢設項目中也不太需要性能優化便不考慮了EasyExcel。

實作步驟

需要讀取資料,并同時對資料讀取時能進行簡單的處理操作。

  1. EasyPoi需要的實體類:因為對資料沒有太多限制,沒有加太多限制類的注釋
@ExcelTarget("wechatData")
    public class WeChatData implements Serializable {
        @Excel(name = "交易時間", orderNum = "1", format = "yyyy-MM-dd HH:mm:ss")
        private String time;

        @Excel(name = "交易類型")
        private String tagName;

        @Excel(name = "商品")
        private String comment;

        @Excel(name = "收/支",replace = {"支出_1","收入_2","/_0"})
        private int typeid;

        @Excel(name = "金額(元)")
        private float money;
    }

           
  1. 自定義Handle處理資料
/**
     * @param obj 目前對象
     * @param name 目前字段名稱
     * @param value 目前值
     * @return
     */
    public class WeChatImportHandle extends ExcelDataHandlerDefaultImpl<WeChatData> {
    @Override
    public Object importHandler(WeChatData obj, String name, Object value) {
        String str = String.valueOf(value);
        if(name.equals("金額(元)")) value = str.substring(1);
        if(name.equals("商品"))
            if(str.equals("/")) value = null;

        return value;
    }
}
           

此處有兩種實作方式,一種是通過實作

IExcelDataHandler<T>

的接口來實作自定義,另一種就是通過實作

ExcelDataHandlerDefaultImpl<T>

接口實作類實作,當需要自定義的項目不多時,後者能更好的規避掉其他的接口方法實作。

這個處理是能在将讀取的檔案值付給對象實參前先對資料進行處理再給實參,是以可以規避資料和實參類型不符的問題,例如"$2.4"無法賦予浮點型資料,即便在實體類中注解使用了

replace()

方法

  1. 功能的基礎實作測試
@Test
    public void testImport(){
        CsvImportParams params = new CsvImportParams();
        WeChatImportHandle handle = new WeChatImportHandle();
        handle.setNeedHandlerFields(new String[]{"金額(元)","商品"});
        params.setTitleRows(16);
        params.setHeadRows(1);
        params.setDataHandler(handle);
        try {
            List<WeChatData> datas = CsvImportUtil.importCsv(new FileInputStream("自定義URL"),
                    WeChatData.class, params);
            datas.forEach(System.out::println);
            System.out.println(datas.size());

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
           

此處需要自設定

setNeedHandlerFields()

方法來對需要使用的列進行控制。