历史文章(文章累计460+)
《国内最全的Spring Boot系列之一》
《国内最全的Spring Boot系列之二》
《国内最全的Spring Boot系列之三》
《国内最全的Spring Boot系列之四》
《国内最全的Spring Boot系列之五》
《国内最全的Spring Boot系列之六》
【EasyPoi实战系列】Spring Boot使用EasyPoi动态控制导出的列 - 第471篇100万数据导出,居然爆炸了OutOfMemoryError?【EasyPoi实战系列】- 第472篇
导出下拉列表的两种小技巧【EasyPoi实战系列】- 第473篇
悟纤:师傅,看你最近都没有动静了。EasyPoi导出是不是讲完了。
师傅:那到没有,那些使用还没讲呢。
悟纤:还有什么?
师傅:比如数据脱敏、换行、枚举、模板文件导出等等等。
悟纤:居然还有这么多的知识要学习。容我消化下…
师傅:今天咱们先讲讲简单的,放松一下。
悟纤:师傅,那就赶紧开始吧。
导读
在前面介绍了有关导出的很多方法和技巧,这一节针对数据脱敏、换行、枚举的情况在聊聊导出的数据处理。
一、换行
1.1 使用换行符号进行换行
首先可以指定换行符号\n进行换行,如下所示:
users.add(new UserExportVO("悟纤",1,new Date(),"18688888888","[email protected]",bytes,"公众号\nSpringBoot"));
1.2 模板文件中
在使用 easypoi 模板导出表格时,可以使用 easypoi 提供的 br 函数来实现单元格内的强制换行。
比如:在导出的 Excel 模板中,使用 ${br(text)} 表示在 text 字符串内的每个换行符处换行。
至于如何使用模板文件进行导出,在下面的小节会进行介绍,这一节,先不展开进行讲解了。
二、数据脱敏
数据脱敏分为两种方法,一种是简单的,在注解或者ExcelExportEntity设置属性既可以,规则如下:
(1)规则1: 采用保留头和尾的方式,中间数据加星号
如: 身份证 6_4 则保留 370101********1234
手机号 3_4 则保留 131****1234
(2)规则2: 采用确定隐藏字段的进行隐藏,优先保留头
如: 姓名 1,3 表示最大隐藏3位,最小一位
李 --> *
李三 --> 李*
张全蛋 --> 张*蛋
李张全蛋 --> 李**蛋
尼古拉斯.李张全蛋 -> 尼古拉***张全蛋
(3)规则3: 特殊符号后保留
如: 邮箱1~@ 表示只保留第一位和@之后的字段
[email protected] -> a********@wupaas.com
复杂版本请使用接口{@link cn.afterturn.easypoi.handler.inter.IExcelDataHandler}即在数据接口自己处理脱敏规则,系统不单独处理。
常用脱敏规则如下,在注解使用比较简单:
@Excel(name = "姓名", desensitizationRule = "1,6")
private String name;
@Excel(name = "身份证", desensitizationRule = "6_4")
private String card;
@Excel(name = "手机号", desensitizationRule = "3_4")
private String phone;
@Excel(name = "邮箱", desensitizationRule = "3~@")
private String email;
这样,就可以把之前的代码修改一下:
@Excel(name = "姓名",width = 15,desensitizationRule = "1,3")
private String realName;
//@Excel(name = "性别",replace = { "男_1", "女_2" }, suffix = "生")
@Excel(name = "性别",replace = { "男生_1", "女生_2" }, addressList = true)
//@Excel(name = "性别",dict = "sex",addressList = true)
private Integer sex;
@Excel(name = "出生日期",format = "yyyy-MM-dd",width = 15)
private Date birthday;
@Excel(name = "手机号码",width = 20,desensitizationRule = "3_4")
private String phone;
@Excel(name = "邮箱",width = 20,desensitizationRule = "1~@")
private String email;
导出结果如下:
三、枚举类型
实体对象属性是枚举支持几种处理模式,如下三总,最基础的无值数据,有值,以及有固定方法:
private Sex sex; //第一种
@Excel(name ="基础状态" )
private StatusEnum baseStatus; //第二种
@Excel(name ="状态" , enumExportField = "message",
enumImportMethod = "getByMessage")
private StatusEnum status;//第三种
对应的Sex枚举类:
public enum Sex {
/**
* 男
*/
MAN,
/**
* 女
*/
WOMAN
}
对应的StatusEnum:
public enum StatusEnum {
Init(0, "初始化"),
Ready(1, "正常"),
ChangePassword(2, "需要修改密码"),
Frozen(4, "冻结"),
Disabled(64, "禁用");
private final Integer _code;
private final String _message;
StatusEnum(Integer code, String message) {
_code = code;
_message = message;
}
public Integer getValue() {
return _code;
}
public String getMessage() {
return _message;
}
public static StatusEnum getByMessage(String message){
StatusEnum[] arr = StatusEnum.values();
for (int i = 0; i < arr.length; i++) {
if (arr[i]._message.equals(message)){
return arr[i];
}
}
return null;
}
}
上面的第一种和第二种都是输出原有的值,MAN,Init等枚举值
第三种是输出对应的方法值,Easypoi适应反射调用getByMessage方法获取方法值