EasyPoi 导入校验使用

因工作需要,使用easypoi导入表格,并进行校验,将表格中有问题的地方,给出提示信息,以表格形式返回.

本篇,直接讲述Excel导入校验,基本介绍后续补上.

1 基于Springboot的easypoi导入表格校验

1 pom.xml

        <!--easypoi与SpringBoot的整合包--><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-spring-boot-starter</artifactId><version>4.1.2</version></dependency>

2 实体类DTO

/*** @author Chengfei* @description 手机类* @date 2021/1/30*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class PhoneDTO {@Max(value = 15,message = "最大不能超过15")@Min(value = 3,message = "最小不能小于3")@Excel(name = "商品id", width = 15,orderNum = "10")@NotNull(message = "商品id不能为空哦!!!")private int id;@Length(max = 2)@Excel(name = "手机名", width = 15,orderNum = "20")@NotNull(message = "用户名不能为空哦!!")private String phoneName;@Excel(name = "价格", width = 15, orderNum = "30")@NotNull(message = "价格不能为空!!")@Digits(integer = 3,fraction = 2,message = "整数位最多3位,小数位最多2位")@DecimalMin(value = "0",message = "成本不能为负数")private BigDecimal cost;@Excel(name = "时间", exportFormat = "yyyy-MM-dd HH:mm:ss", importFormat = "yyyy-MM-dd HH:mm:ss", width = 25, orderNum = "40")private LocalDateTime createTime;/*String类型可以使用正则校验@Pattern(regexp = "^[1-9]\\d*\\.\\d*|0\\.\\d*[1-9]\\d*$" ,message = "必须为金额数值")private String money;
*/}

3 工具类

public class ExcelUtils {/*** excel 导出** @param list      数据* @param title     标题* @param sheetName sheet名称* @param pojoClass pojo类型* @param fileName  文件名称* @param response*/public static void exportExcel(List<?> list, String title, String sheetName, Class<?> pojoClass, String fileName, HttpServletResponse response) throws IOException {defaultExport(list, pojoClass, fileName, response, new ExportParams(title, sheetName, ExcelType.XSSF));}/*** 默认的 excel 导出** @param list         数据* @param pojoClass    pojo类型* @param fileName     文件名称* @param response* @param exportParams 导出参数*/private static void defaultExport(List<?> list, Class<?> pojoClass, String fileName, HttpServletResponse response, ExportParams exportParams) throws IOException {Workbook workbook = ExcelExportUtil.exportExcel(exportParams, pojoClass, list);downLoadExcel(fileName, response, workbook);}/*** 下载** @param fileName 文件名称* @param response* @param workbook excel数据*/private static void downLoadExcel(String fileName, HttpServletResponse response, Workbook workbook) throws IOException {try {response.setCharacterEncoding("UTF-8");response.setHeader("content-Type", "application/vnd.ms-excel");response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName + "." + ExcelTypeEnum.XLSX.getValue(), "UTF-8"));workbook.write(response.getOutputStream());} catch (Exception e) {throw new IOException(e.getMessage());}}/*** Excel 类型枚举*/enum ExcelTypeEnum {XLS("xls"), XLSX("xlsx");private String value;ExcelTypeEnum(String value) {this.value = value;}public String getValue() {return value;}}}

4 自定义校验类

/*** @author Chengfei* @description* @date 2021/1/30*/
@Component
public class PhoneExcelverifiyName implements IExcelVerifyHandler<PhoneDTO> {//保存表格中的手机名称private static  Set<String> stringSet = new HashSet<>();@Overridepublic ExcelVerifyHandlerResult verifyHandler(PhoneDTO phoneDTO) {//设置默认验证为trueExcelVerifyHandlerResult excelVerifyHandlerResult = new ExcelVerifyHandlerResult(true);if (StringUtils.isNotBlank(phoneDTO.getPhoneName())) {stringSet.add(phoneDTO.getPhoneName());StringBuilder str = new StringBuilder();//校验表格中手机名称是否一致, 不一致,给出错误提示if (stringSet.size()>1){excelVerifyHandlerResult.setSuccess(false);str.append("手机名称不一致 ");}// 手机名为小米 则为重复录入if ("小米".equals(phoneDTO.getPhoneName())) {if (excelVerifyHandlerResult.isSuccess()){excelVerifyHandlerResult.setSuccess(false);str.append("手机名称重复");}else {str.append(",手机名称重复");}}excelVerifyHandlerResult.setMsg(str.toString());}return excelVerifyHandlerResult;}
}

5 controller控制层

/*** @author Chengfei* @description* @date 2021/1/30*/
@Controller
@RequestMapping("/phone")
public class PhoneController {/*** 导出1  使用网上excel导出导入工具类  无需校验的导入导出** @param response*/@RequestMapping(value = "/export")public void exportExcel(HttpServletResponse response) throws IOException {List<PhoneDTO> phoneDTOList = new ArrayList<>();phoneDTOList.add(new PhoneDTO(6,"小米",new BigDecimal(33.00),LocalDateTime.now()));phoneDTOList.add(new PhoneDTO(2,"小米",new BigDecimal(33.00),LocalDateTime.now()));phoneDTOList.add(new PhoneDTO(18,"小米米米米米米",new BigDecimal(33.00),LocalDateTime.now()));phoneDTOList.add(new PhoneDTO(6,null,new BigDecimal(-1.02),LocalDateTime.now()));phoneDTOList.add(new PhoneDTO(6,"小米",new BigDecimal(3322.00),LocalDateTime.now()));phoneDTOList.add(new PhoneDTO(6,"小米",new BigDecimal(33.0067),LocalDateTime.now()));ExcelUtils.exportExcel(phoneDTOList, "手机信息表", "手机信息", PhoneDTO.class, "手机信息", response);}@Autowiredprivate PhoneExcelverifiyName phoneExcelverifiyName;/*** 文件校验导入** @return*/@RequestMapping("/import")public Object upload(MultipartFile file,HttpServletResponse resp) throws Exception {//导入的基本配置ImportParams params = new ImportParams();//表头一行params.setHeadRows(1);//标题一行params.setTitleRows(1);//代表导入这里是需要验证的(根据字段上的注解校验)params.setNeedVerify(true);//设及一个自定义校验 (自定义校验名字不可重复)params.setVerifyHandler(phoneExcelverifiyName);//使用框架自身导入工具ExcelImportResult<PhoneDTO> result = ExcelImportUtil.importExcelMore(file.getInputStream(), PhoneDTO.class, params);//导入成功的数据List<PhoneDTO> list = result.getList();//失败结果集List<PhoneDTO> failList = result.getFailList();//拿到导出失败的工作簿Workbook failWorkbook = result.getFailWorkbook();//验证是否有失败的数据if (result.isVerifyFail()) {ServletOutputStream fos = resp.getOutputStream();//mime类型resp.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");resp.setHeader("Content-disposition", "attachment;filename=error.xlsx");result.getFailWorkbook().write(fos);fos.close();}return failList;}}

6 结果展示

http://localhost:8080/phone/export

http://localhost:8080/phone/import把下载文件上传

7 说明

要求对导入的表格字段进行校验,并将错误的列,给出提示返回,如没有错误,返回表格内容.

要求:

  • 手机名为小米,则提示重复导入
  • 手机名不一致,提示手机名称不一致
  • 手机名不能为空
  • 商品id,大于等于3,小于等于15,且不为空
  • 价格中整数最多3位,小数最多2位,且必须为数字类型

EasyPoi 导入校验使用相关推荐

  1. easypoi导入校验跳过空行_Easy-POI是一款Excel导入导出解决方案组成的轻量级开源组件...

    Excel-Boot是一款Excel导入导出解决方案组成的轻量级开源组件. 如果喜欢或愿意使用, 请star本项目或者点击donate图标捐赠我们 如果是企业使用, 为了产品推广, 请通过评论.Iss ...

  2. EasyPOI导入多个sheet,既可更新又可新增,且从第二个sheet开始是根据第一个sheet内容的详情导入

    1.第一张sheet的导入类 @Data @ExcelTarget("PmAppServiceManageNewImportVO") @EqualsAndHashCode(call ...

  3. easypoi导入复杂表头Excel

    引入Easypoi的maven坐标,我使用的是4.0.0版本 <dependency><groupId>cn.afterturn</groupId><arti ...

  4. 如何使用Easy-POI导入复杂表头的Excel报表(含源码级分析)

    本文旨在解决使用Easy-POI导入复杂表头(导出)时,遇上的EXCEL文件中的字段无法正常映射到Bean的问题,官方的示例和其他的CSDN文章基本上没有很详细的教程,于是自己写一个 这是需要导入的表 ...

  5. easypoi导入excel实践方法:

    easypoi导入excel实践方法: https://www.cnblogs.com/vcmq/p/12149673.html

  6. easypoi导入图片_原生POI / EasyPOI 简单上手使用

    原生POI 导入依赖: ​ 导出到Excel(将数据放入Excel) 普通文本: ​ 日期: ​ 对象集合: 实体类 ​ 案例代码 ​ ​ 从Excel导入(从Excel取数据) ​ ​ 测试打印成功 ...

  7. excel模板文件下载与导入校验

    下载模板文件 window.location.href = encodeURI(basePath + "/util/downtemplate.jsp?filename="+file ...

  8. springboot整合easypoi导入带图片excel并将图片上传到FastDFS服务器

    springboot整合easypoi导入带图片excel并将图片上传到FastDFS服务器 1.使用easypoi导入excel 链接: easypoi详细文档. 2.导入easypoi依赖,版本可 ...

  9. EASYPOI导入报错The part /xl/drawings/drawing1.xml failed to be saved

    EASYPOI导入报错The part /xl/drawings/drawing1.xml failed to be saved Caused by: org.apache.poi.openxml4j ...

最新文章

  1. mssql mysql 语法区别_mssql与mysql区别之——变量区别
  2. Nature Cancer | 发现非肿瘤药物的抗癌潜力
  3. iRank: 基于互联网类脑架构的阿尔法鹰眼发展趋势评估
  4. redis(3)redis的基础入门(java)
  5. MySQL多对多创建表语句(防忘记)
  6. 一个页面从输入URL到加载显示完成,发生了什么?
  7. keepalive日志_12.日志收集项目-数据流图以及nginx安装
  8. unity里如何在点击UI时,避免触发游戏内操作。
  9. oracle 函数 abs,Oracle 函数(八)
  10. 程序员面试题之解读构造函数
  11. python3根据图片链接下载图片
  12. 微信小程序地图回到原点
  13. 个人网站建设基本步骤解析
  14. 系统计算机怎么恢复出厂设置,电脑怎么恢复出厂设置 电脑恢复出厂设置的方法 - 云骑士一键重装系统...
  15. ES中的Multi_match深入解读:best_fields、most_fields、cross_fields用法一览
  16. java并发机制_Java并发机制的底层实现原理.PDF
  17. SDN和NFV并没有迅速落地的原因是什么?
  18. Mysql分页Limt
  19. 64位开源处理器Rocket的源代码简单介绍
  20. IE无法查看源文件原因及解决办法

热门文章

  1. CST软件遇到这个问题,打不开软件,有什么办法?求教各位电磁学同行
  2. Docker安装和加速器配置
  3. 单点登录(Single Sign On)的理解
  4. 分期付款的利率不是这么算的!我用Python告诉你亏了多少!
  5. 高老师的架构设计_隽语集(AA_0301)
  6. 企业能带给员工什么?
  7. 汇编学习教程:灵活寻址(三)
  8. 股​票​投​资​5​0​本​经​典​书​籍
  9. 安卓自定义日历选择器
  10. netapp管理地址_NetApp ONTAP Simulator部署指南(1)