天天看点

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

方法来对需要使用的列进行控制。