Easypoi注解校验导入和模板方式导出记录

项目场景:

项目场景:针对一般的管理系统或者报表类系统,导入excel和导出是必须有的功能,而使用原生的POI,接口方法多,使用繁琐,不利于开发,所以引入cn.afterturn.easypoi-base.3.2.0.jar 和 com.apache.poi.3.17.0.jar 。poi的版本是原项目导入导出功能存在的依赖,所以导致easypoi引入4.2.0后出现版本兼容问题,导致改动量剧增,本次基于以上版本问题记录。


问题1 性能问题,使用ExcelImportUtil.importExcel()进行注解校验效率低

例如:

ImportParams params = new ImportParams();
//标题行数  表头行数  是否需要校验   是否需要分割表格(设置为true,会进行拆分 校验成功workboot和校验失败failWorkboot ,这里会消耗性能,高版本可以直接使用api避免,低版本需要手动修改源码)
params.setTitleRows(2); //没有的话可以不设置,默认为0
params.setHeadRows(2); //这里需要注意,如果表头和标题设置的不对,有可能导致第一列读取不到值。
params.setNeedVerify(true);
params.setNeedVerifySplit(true);  //这里高版本可以,低版本我是通过修改源码解决

//这里可以 自定义校验规则
params.setVerifyHandler(verifyHandler);

ExcelImportResult<Student> result = ExcelImportUtil.importExcel(inputStream,Student.class,params);
result 包含校验成功和校验失败的内容。以及生成workboot工作簿

同时也可以保存图片,这里不介绍。

**调试源码可以看到,低版本无法把分割表格通过API避免,所以修改源码 ** 这里也可以通过反射去得到自己想要的内容
只需要在下图源码处添加
else{
	importResult.setFailList(failCollection);
	importResult.setVerfiyFail(verfiyFail);
	importResult.setWorkbook(wb);
}
详细的获取源码和修改使用就不阐述了。

在这里插入图片描述

@Excel 注解
value 列名  默认时列名必须和导入的表头名字一致,否则无法导入
fixedId 固定列顺序   替代列名,列名比较复杂或者有合并情况,建议使用
replace 替代字典值   把表格中男转成 01  [男_01,女_02]
@patter校验注解为校验的部分,不是easypoi的注解,可以自行学习,校验注解还有以下内容
以下为校验注解,这部分可以自行学习
@Null	被注释的元素必须为 null
@NotNull	被注释的元素必须不为 null

@NotEmpty   集合不为空且集合元素不能为空集合
@NotBlack    字符串不为空且不能为空串

@Min(value)	被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value)	被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(value)	被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value)	被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Size(max, min)	被注释的元素的大小必须在指定的范围内,包括字符长度和集合大小
@Length  验证字符串长度
@Digits (integer, fraction)	被注释的元素必须是一个数字,其值必须在可接受的范围内

@Negative  验证字段为负数
@Positive 验证字段为整数
@NegativeOrZero  负数或者0
@PositiveOrZero  正数或者0

@AssertTrue	被注释的元素必须为 true
@AssertFalse	被注释的元素必须为 false

@Past	被注释的元素必须是一个过去的日期
@Future	被注释的元素必须是一个将来的日期
@PastOrPresent  过去的日期包含当前时间
@FutureOrPresent  将来的时间包含当前时间

@Pattern(regex=正则表达式)	被注释的元素必须符合指定的正则表达式
@Email  验证字段必须为邮箱

问题2:使用模板导出无法导出内容,文件一致为空

例如:导入模板放在 resource 资源目录的 template文件夹下。

TempalteExportParms params = new TemplateExportParams("template/xxx.xlsx"); //注意这里前面不能加 /

Map<String,Object> map = new HashMap<>();
map.put("list",list);

Workboot workboot = ExcelExportUtil.exportExcel(params,map);

//导不出数据的原因,workboot一直为空,而list是有数据的,最终折腾了一下午,为模板文件语法问题,
//错误语法 {{$fe: list h h.id     h.name   h.age}} 这里可以取别名 h,但是使用上无法导出,可能是版本问题把。
//正确语法 {{$fe: list t.id     t.name   t.age}} 只能使用默认的t
下面列举下EasyPoi支持的指令以及作用,最主要的就是各种fe的用法

三目运算 {{test ? obj:obj2}}
n: 表示 这个cell是数值类型 {{n:}}
le: 代表长度{{le:()}}if/else 运用{{le:() > 8 ? obj1 : obj2}}
fd: 格式化时间 {{fd:(obj;yyyy-MM-dd)}}
fn: 格式化数字 {{fn:(obj;###.00)}}
fe: 遍历数据,创建row
!fe: 遍历数据不创建row
$fe: 下移插入,把当前行,下面的行全部下移.size(),然后插入
#fe: 横向遍历
v_fe: 横向遍历值
!if: 删除当前列 {{!if:(test)}}
单引号表示常量值 ‘’ 比如’1’ 那么输出的就是 1
&NULL& 空格
]] 换行符 多行遍历导出
sum: 统计数据

总结

可能有的地方并不准确,欢迎大家评论指正,记录一次引入easypoi的经历。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值