项目场景:
项目场景:针对一般的管理系统或者报表类系统,导入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的经历。