easyExcel实战:(二)easyExcel读写Excel两种方式(有无java模型)

一、针对Excel的映射java实体模型,建议采用不同于业务实体的命名法,这样容易区分,命名例如:

    UserExcelDTO。

    POJO是DO/DTO/BO/VO的统称,介绍如下:

    DO(Data Object):与数据库表结构一一对应,通过DAO层向上传输数据源对象。
    DTO(Data Transfer Object):数据传输对象,Service或Manager向外传输的对象。
   BO(Business Object):业务对象。由Service层输出的封装业务逻辑的对象。
   AO(Application Object):应用对象。在Web层与Service层之间抽象的复用对象模型,极为贴近展示层,复用度很低
   VO(View Object):显示层对象,通常是Web向模板渲染引擎层传输的对象。
   Query:数据查询对象,各层接收上层的查询请求。注意超过2个参数的查询封装,禁止使用Map类来传输。

   所以常用的pojo实体命名规范是:

    1.数据库表的实体对象采用大驼峰法,并且和表名一样(表名一般是下划线命名法),例如:UserAccount.java,库表名是user_account

    2.用于视图的pojo(这个有时候为了展示视图或者接收视图的数据用时),这时候命名后面加上一个VO,例如:loginAccountVO.java。

    3.数据传输用的pojo,命名为XXXDTO。

二、读写Excel,easyExcel提供两种方式,它不容易出现内存溢出就是因为它是读写一行就进行解析:

(1)无java模型直接读写excel。

 (2)java模型读写excel。

三、应用例子:无模型读Excel:

@Test
    public void testExcel2003NoModel() {
        InputStream inputStream = getInputStream("loan1.xls");
        try {
            // 解析每行结果在listener中处理
            ExcelListener listener = new ExcelListener();

            ExcelReader excelReader = new ExcelReader(inputStream, ExcelTypeEnum.XLS, null, listener);
            excelReader.read();
        } catch (Exception e) {

        } finally {
            try {
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

 

ExcelListener示例代码如下:

 /* 解析监听器,
 * 每解析一行会回调invoke()方法。
 * 整个excel解析结束会执行doAfterAllAnalysed()方法
 *
 * 下面只是我写的一个样例而已,可以根据自己的逻辑修改该类。
 * @author jipengfei
 * @date 2017/03/14
 */
public class ExcelListener extends AnalysisEventListener {

    //自定义用于暂时存储data。
    //可以通过实例获取该值
    private List datas = new ArrayList();
    public void invoke(Object object, AnalysisContext context) {
        System.out.println("当前行:"+context.getCurrentRowNum());
        System.out.println(object);
        datas.add(object);//数据存储到list,供批量处理,或后续自己业务逻辑处理。
        doSomething(object);//根据自己业务做处理
    }
    private void doSomething(Object object) {
        //1、入库调用接口
    }
    public void doAfterAllAnalysed(AnalysisContext context) {
       // datas.clear();//解析结束销毁不用的资源
    }
    public List getDatas() {
        return datas;
    }
    public void setDatas(List datas) {
        this.datas = datas;
    }
} 
  

四、应用例子:java模型读写,定义Excel的java实体模型映射:

public class LoanInfo extends BaseRowModel {
    @ExcelProperty(index = 0)
    private String bankLoanId;
    
    @ExcelProperty(index = 1)
    private Long customerId;
    
    @ExcelProperty(index = 2,format = "yyyy/MM/dd")
    private Date loanDate;
    
    @ExcelProperty(index = 3)
    private BigDecimal quota;
    
    @ExcelProperty(index = 4)
    private String bankInterestRate;
    
    @ExcelProperty(index = 5)
    private Integer loanTerm;
    
    @ExcelProperty(index = 6,format = "yyyy/MM/dd")
    private Date loanEndDate;
    
    @ExcelProperty(index = 7)
    private BigDecimal interestPerMonth;

    @ExcelProperty(value = {"一级表头","二级表头"})
    private BigDecimal sax;
}

@ExcelProperty(index = 3)数字代表该字段与excel对应列号做映射,也可以采用 @ExcelProperty(value = {"一级表头","二级表头"})用于解决不确切知道excel第几列和该字段映射,位置不固定,但表头的内容知道的情况。这里要好好理解一下它的多级表头概念的设置方式(合并单元格时去设置多级表头这是种常见情形)。

 

  @Test
    public void testExcel2003WithReflectModel() {
        InputStream inputStream = getInputStream("loan1.xls");
        try {
            // 解析每行结果在listener中处理
            AnalysisEventListener listener = new ExcelListener();

            ExcelReader excelReader = new ExcelReader(inputStream, ExcelTypeEnum.XLS, null, listener);

            excelReader.read(new Sheet(1, 2, LoanInfo.class));
        } catch (Exception e) {

        } finally {
            try {
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }

带模型解析与不带模型解析主要在构造new Sheet(1, 2, LoanInfo.class)时候包含class。Class需要继承BaseRowModel暂时BaseRowModel没有任何内容,后面升级可能会增加一些默认的数据。

你可能感兴趣的:(工具类,easyExcel,poi)