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();
}
生成表格
注意事项
此处数据源不能使用Arrays.asList()生成数据集
因为在调用生成excel方法时,会对数据集进行删除操作,而Arrays.asList()生成的集合并不能调用原始List的一些操作,故产生报错。
具体可搜索ArrayList和Arrays.asList()
导出集合属性
实体新增字段(数据自行构造)
@Excel(name = "喜欢的运动",width = 20,orderNum = "4")
private List<String> sports;
但此时导出结果为
故进行调整
@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 );
}
导出结果
导出对象属性(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;
导出对象集合属性(一对多关系)
新增对象集合字段
当设置needMerge = true,即可实现单元格合并
@ExcelCollection(name = "订单列表",orderNum = "5")
private List<MyOrder> orders;
导出结果
导出图片
情况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
导出得到,可自行设置位置,如果此时读取不到图片,单元格将为空白
情况2 字段存储字节数组
@Excel(name = "头像",type = 2,imageType = 2,width = 20,height = 15)
private byte[] logo;
至此基本的导出操作学习完毕
导出大数据
当数据量达几万,上百万时候,建议使用如下方法,且可进行分段导出,环节excel导出压力
ExcelExportUtil.exportBigExcel()
ExcelExportUtil.closeExportBigExcel();
导入
常用的结合注解导入
准备excel文件
导入实体
@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);
结果
导入其他方法
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导出