easypoi介绍 

为什么要用easypoi?

实现excel表格的导入导出,基于模板的导出

easypoi简化poi的操作,让人更加快速上手使用

*easyexcel快速学习笔记

官方教程

EasyPoi教程_V1.0http://easypoi.mydoc.io/

easypoi使用

导入依赖

注意3个依赖版本要保持一致

easypoi-base 导入导出相关

easypoi-web 页面渲染相关

easypoi-annotation 注解相关

<dependency>
    <groupId>cn.afterturn</groupId>
    <artifactId>easypoi-base</artifactId>
    <version>3.2.0</version>
</dependency>
<dependency>
    <groupId>cn.afterturn</groupId>
    <artifactId>easypoi-web</artifactId>
    <version>3.2.0</version>
</dependency>
<dependency>
    <groupId>cn.afterturn</groupId>
    <artifactId>easypoi-annotation</artifactId>
    <version>3.2.0</version>
</dependency>

基础注解

详细见官方教程

思想:一个对象对应一行,一个对象集合就是所有数据行,每个对象的属性对应每个列

@ExcelTarget 作用对象上

标识对象,通常需要指定该对象的唯一标识,如@ExcelTarget("user"),表示该对象即将成为导出的一行

@Excel 作用每个字段上

常用属性

name 导出列名
orderNum 该字段转化成列的顺序
replace 字段中某个值的替换,导出是{a_id,b_id} 导如状态“1”导出替换为“已完成”
suffix 导出值增加后缀,如XX,增加后缀¥
width/height 列宽/高
needMerge 是否需要纵向合并单元格(用于含有list中,单个的单元格,合并list创建的多个row)
type 导出类型1 是文本 2 是图片,3 是函数,10 是数字 默认是文本
exportFormat/importFormat 导出/导入时间格式转换
format 同时设置导入导出时间格式
其他见官方教程

@ExcelIgnore

无视实体对象某个字段不导出

@ExcelEntity

实体对象中的内部类属性,一对一

@ExcelCollection

实体对象中的集合属性,一对多

注解方式导出

定义实体并加上注解

一定要序列化

@Data
@ExcelTarget("user")
public class User implements Serializable {
    @Excel(name = "编号")
    private String id;

    @Excel(name = "姓名")
    private String name;

    @Excel(name = "时间",format = "yyyy-MM-dd HH:mm:ss")
    private Date date;
}

通过工具类ExcelExportUtil进行导出操作

ExcelExportUtil.exportExcel() 数据量较少情况使用 

ExcelExportUtil.exportBigExcel()数据量上万情况使用

exportExcel()参数说明

ExportParams 导出表格的基础配置对象,如标题,sheet页名

Class<?> 导出实体的类型

Collection<?> 数据集

public static void main(String[] args) throws IOException {
        List<User> users = new ArrayList<>();
        users.add(new User("001","小明",new Date()));
        users.add(new User("002","小红",new Date()));
        //获得工作簿
        ExportParams exportParams = new ExportParams("用户列表","第一页");
        Workbook workbook = ExcelExportUtil.exportExcel(exportParams,User.class,users);
        //将工作簿的数据写到指定位置生成表格 web开发可直接将将流输出给前端
        FileOutputStream fileOutputStream = new FileOutputStream("D:\\test\\test.xlsx");
        workbook.write(fileOutputStream);
        fileOutputStream.close();
        workbook.close();
    }

生成表格

easypoi 导出excel java easypoi导入导出excel_开发语言

注意事项

此处数据源不能使用Arrays.asList()生成数据集

因为在调用生成excel方法时,会对数据集进行删除操作,而Arrays.asList()生成的集合并不能调用原始List的一些操作,故产生报错。

具体可搜索ArrayList和Arrays.asList()

导出集合属性

实体新增字段(数据自行构造)

@Excel(name = "喜欢的运动",width = 20,orderNum = "4")
private List<String> sports;

但此时导出结果为

easypoi 导出excel java easypoi导入导出excel_后端_02

 故进行调整

@Excel(name = "喜欢的运动",width = 20,orderNum = "4")
    private String sportTemp;

    public String getSportTemp() {
        StringBuilder sb = new StringBuilder();
        sports.forEach(s -> {
            sb.append(s).append("、");
        });
        return sb.toString().substring(0,sb.length() - 1 );
    }

导出结果

easypoi 导出excel java easypoi导入导出excel_开发语言_03

导出对象属性(1对1关系)

内部对象属性的字段值均转换为新的列,可以直接理解为,内部对象的所有字段转换为当前对象的同级字段

新建(此时orderNum与User中字段orderNum同级)

@Data
@AllArgsConstructor
@ExcelTarget("order")
public class MyOrder implements Serializable {

    @Excel(name = "订单号",orderNum = "5")
    private String id;

    @Excel(name = "订单名",orderNum = "6")
    private String name;
}

在User类中新增(此时可不需要携带参数)

@ExcelEntity
private MyOrder order;

easypoi 导出excel java easypoi导入导出excel_字段_04

导出对象集合属性(一对多关系)

新增对象集合字段

当设置needMerge = true,即可实现单元格合并

@ExcelCollection(name = "订单列表",orderNum = "5")
private List<MyOrder> orders;

 导出结果

easypoi 导出excel java easypoi导入导出excel_java_05

导出图片

情况1 字段存储图片路径

绝对路径,保证能读取到图片

type必须指定为2,表示字段为图片,imageType=1默认也为1表示根据绝对路径直接获取图片

imageType=2表示字段为字节数组,直接渲染成图片,及情况2

根据设置字段长宽来调整图片大小

@Excel(name = "头像",type = 2,imageType = 1,width = 20,height = 15)
private String logo;

将图片存在桌面,设置字段值

C:\Users\Administrator\Desktop\dog.jpeg

导出得到,可自行设置位置,如果此时读取不到图片,单元格将为空白

easypoi 导出excel java easypoi导入导出excel_后端_06

 情况2 字段存储字节数组

@Excel(name = "头像",type = 2,imageType = 2,width = 20,height = 15)
private byte[] logo;

至此基本的导出操作学习完毕

导出大数据

当数据量达几万,上百万时候,建议使用如下方法,且可进行分段导出,环节excel导出压力

ExcelExportUtil.exportBigExcel()

ExcelExportUtil.closeExportBigExcel();

导入

常用的结合注解导入

准备excel文件

easypoi 导出excel java easypoi导入导出excel_后端_07

 导入实体

@Data
@ExcelTarget("user")
public class UserDTO implements Serializable {
    @Excel(name = "编号")
    private String id;

    @Excel(name = "姓名")
    private String name;

    @Excel(name = "时间",format = "yyyy-MM-dd HH:mm:ss")
    private Date date;
}

 导入代码

//设置表格的标题初始位置 数据初始位置等
        ImportParams params = new ImportParams();
        params.setTitleRows(1); //标题占了几行
        params.setHeadRows(2);//header占了几行
        //excel文件流 导入类型 导入配置对象
        List<UserDTO> users = ExcelImportUtil.importExcel(new FileInputStream("D:\\test\\test.xlsx"), UserDTO.class,params);
        users.forEach(System.out::println);

结果

easypoi 导出excel java easypoi导入导出excel_后端_08

 导入其他方法

params.setStartSheetIndex(n) 读取第n个sheet 0开始表示第一个sheet

params.setSheetNum读取几个sheet

表头初步校验:

params.setImportFields(new String[]{”编号“});//表示导入的表头必须含有"编号"

导入头像时,可以指定存储的文件位置(或者自定义文件服务器),如

@Excel(name = "头像",type = 2,savePath = "D:\\test\\images") 
private String logo;

web中,当前端传文件至后端,后端用MultipartFile file接收,file.getInputStream()获取流

web中,导出则直接将数据转为流给前端渲染

以上完成简单easypoi导入导出的简单学习

其他点请参考官方教程

1.结合Map的导入
2.样式美化
3.基于excel模板导出(实现定制化excel)
*基于word模板的导出
*pdf导出