<pre class="preclass"><p>前言:开发中会经常碰到涉及EXCEL的导入导出,对java程序员而言,EXCEL的相关操作绝大多数的人会采用Apache开源的POI进行开发,POI封装的属于比较底层的操作,功能强大,可扩张性极好,同时难度不大,但因为较为底层,封装的不够,对开发人员来说,即便是最简单的导入导出涉及的代码也比较繁琐,而且在开发中会有很多重复代码,这些重复代码你可以自己封装工具类,也可以网上找一些现成的工具类,从而避免重复造轮子的问题,一开始我也是傻乎乎的自己封装轮子,直到后来遇到EASY-POI和HUTOOL,那种感觉就像是从吃自己烧的黑暗料理突然有一天改吃米其林大师烧的大餐,妙不可言...几行代码就可以轻松搞定EXCEL的常见开发,代码看上去非常优雅,即便是从来没学过POI的小白也可以轻松上手.

   

1.Easy-Poi简介

   

  Easy-Poi是国产的,由国人开源的代码,是在POI的基础上进行封装的Excel操作工具库,这里援引其官网的介绍:

  easypoi功能如同名字easy,主打的功能就是容易,让一个没见接触过poi的人员 就可以方便的写出Excel导出,Excel模板导出,Excel

  导入,Word模板导出,通过简单的注解和模板 语言(熟悉的表达式语法),完成以前复杂的写法

  官网地址: [http://easypoi.mydoc.io/]2

 

2.实战

   

  先从最简单的导出开始,需求是:我需要把一个班所有人的姓名,年龄等个人信息导出到Excel文件中.

  第一步:引入依赖

  
`

        cn.afterturn
        easypoi-base
        3.2.0
    
    
        cn.afterturn
        easypoi-web
        3.2.0
    
    
        cn.afterturn
        easypoi-annotation
        3.2.0
    `</pre>

  第二步:在实体类上添加注解

  注解比较多,但简略的导出导入或许你只须要了解一两个即可,比如@Excel,该注解上面可以指定导入的列名,是否导入,第几列等,日常开发只须要了解我下边帖出的这几个即可,更详细可以可以参考官网,为了篇幅跟讲解主要内容,这里就不帖出了.

  <pre class="has">
`@Data//这个是lombok插件(推荐)添加此注解相当于是get,set,toString等一次性全部自动生成
@ExcelTarget("studentEntity")
public class Student implements Serializable {

private static final long serialVersionUID = 1L;
@Excel(name = "序号",isImportField = "true",orderNum = "1")
private Integer serialNum;
@Excel(name = "学校",isImportField = "true",orderNum = "2")
private String schoolName;
@Excel(name = "姓名",isImportField = "true",orderNum = "3")
private String studentName;
@Excel(name = "右眼",isImportField = "true",orderNum = "4")
private String odVision;
@Excel(name = "左眼",isImportField = "true",orderNum = "5")
private String osVision;

}
@ExcelTarget("Eyesight")
@Data
public class Eyesight {

@Excel(name = "右眼",isImportField = "true",orderNum = "4")
private String odVision;
@Excel(name = "左眼",isImportField = "true",orderNum = "5")
private String osVision;

}
@Data
@ExcelTarget("StudentDTO")
public class StudentDTO implements Serializable {

private static final long serialVersionUID = 1L;
@Excel(name = "序号",isImportField = "true",orderNum = "1")
private Integer serialNum;
@Excel(name = "学校",isImportField = "true",orderNum = "2")
private String schoolName;
@Excel(name = "姓名",isImportField = "true",orderNum = "3")
private String studentName;
@ExcelEntity(id = "Eyesight",name = "裸眼视力",show = true)
private Eyesight eyesight;

}
`</pre>

  第三步:编写测试类

  <pre class="has">
` public void writeData() {

    //封装数据
    List studentDTOS = new ArrayList();
    for (int i = 0; i < 2; i++) {
        StudentDTO studentDTO = new StudentDTO();
        Eyesight eyesight = new Eyesight();
        studentDTO.setSerialNum(i);
        studentDTO.setSchoolName("测试小学");
        studentDTO.setStudentName("王老" + i);
        eyesight.setOdVision("5.3");
        eyesight.setOsVision("5.0");
        studentDTO.setEyesight(eyesight);
        studentDTOS.add(studentDTO);
    }
    Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("学生信息","01班"), StudentDTO.class, studentDTOS);//创建工作簿,其中Params中的两个参数分别指定了标题和sheet名
    String path = "F:/tmp/"+EXCEL_NAME;//导出路径,我放在了F盘的tmp文件夹下
    OutputStream outputStream = null;
    try {
        outputStream = new FileOutputStream(path);
        workbook.write(outputStream);
    } catch (Exception e) {
        e.printStackTrace();
    }finally {
        try {
            outputStream.close();
            workbook.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

public static void main(String[] args) {

    writeData();
</pre>

  上面的代码看上去多,其实这些是在封装数据跟捕捉异常,导出只要一行代码就搞定了,还是十分简略的...

  第四步:运行之

  在F盘指定目录下成功找到test.xlsx文件,打开后:

  OJBK,搞定...

  导入和导入如出一辙,也是十分简略,我就不演示了,官网上全得太...

  3.后话

  在实际开发中,需求可没那么简单,产品总监那种糟老头子可坏得太,导入跟导入要求都比较多,尤其是导入,要变得很高大上才行...

  比如象下边这些款式:

  再或则下边这些:

  像这种相对比较复杂的表结构,如果通过设置导入参数的方法,那难度也很大了,下面介绍一种比较简略好用的方法,就是使用现成的模版,然后数据的话使用我要填充的数据,我以第一张图的模版为例:

  在导入时,会把上表里用{{xxx}}和{{$fe:xxx}}表示的数据全部用真实数据替换掉.

  对于模版中非循环的元素,如市城区很多,可以选用{{xxx}}即可,对于类似于List类别的数据,则选用{{$fe:xxx}}这种格式.

  $fe递归应当是使用最广的递归typecho模板编写,用来解决递归后下边也有数据的处理方法 我们要生成的是这个须要一些list集合跟一些单纯的数

  据fe的写法 fe标识 冒号 list数据 单个元素数据(默认ttypecho模板编写,可以不写) 第一个元素 {{$fe: maplist t t.id }}

  测试代码如下:

<p><pre class="has">
public void download() {

    TemplateExportParams templateExportParams = new TemplateExportParams("F:/tmp/导出模板.xls");
    Map map = new HashMap();
    map.put("provinceName","浙江省");
    map.put("cityName","杭州市");
    map.put("areaName","江干区");
    map.put("schoolName","杭州第一中学");
    map.put("grade","初一");
    map.put("nowDate","2018-12-25");
    map.put("mmp","");
    List mapList = new ArrayList();
    for (int i = 0; i 
Last modification:March 28th, 2021 at 10:10 am
如果觉得我的文章对你有用,请随意赞赏