#### 2.8 Excel导入校验 校验,是一个不可或缺的功能,现在java校验主要是JSR 303 规范,实现方式主流的有两种 * Hibernate Validator * Apache Commons Validator 这个AutoPoi没有限制,只要你防止一个实现丢到maven中就可以了,但是Hibernate Validator用的貌似多一些 之前的版本AutoPoi有定义自己的实现,但是后来抛弃了,没有必要造这种轮子,这个了功能已经够丰富了 ## 使用 ***对象*** AutoPoi的校验使用也很简单,对象上加上通用的校验规则或者这定义的这个看你用的哪个实现 然后params.setNeedVerfiy(true);配置下需要校验就可以了 看下具体的代码 ~~~ /** * Email校验 */ @Excel(name = "Email", width = 25) private String email; /** * 最大 */ @Excel(name = "Max") @Max(value = 15,message = "max 最大值不能超过15" ,groups = {ViliGroupOne.class}) private int max; /** * 最小 */ @Excel(name = "Min") @Min(value = 3, groups = {ViliGroupTwo.class}) private int min; /** * 非空校验 */ @Excel(name = "NotNull") @NotNull private String notNull; /** * 正则校验 */ @Excel(name = "Regex") @Pattern(regexp = "[\u4E00-\u9FA5]*", message = "不是中文") private String regex; ~~~ 这里的校验规则都是JSR 303 的,使用方式也是的,这里就不做解释了 然后使用方式是 ~~~ @Test public void basetest() { try { ImportParams params = new ImportParams(); params.setNeedVerfiy(true); params.setVerfiyGroup(new Class[]{ViliGroupOne.class}); ExcelImportResult<ExcelVerifyEntity> result = ExcelImportUtil.importExcelMore( new File(PoiPublicUtil.getWebRootPath("import/verfiy.xlsx")), ExcelVerifyEntity.class, params); FileOutputStream fos = new FileOutputStream("D:/excel/ExcelVerifyTest.basetest.xlsx"); result.getWorkbook().write(fos); fos.close(); for (int i = 0; i < result.getList().size(); i++) { System.out.println(ReflectionToStringBuilder.toString(result.getList().get(i))); } Assert.assertTrue(result.getList().size() == 1); Assert.assertTrue(result.isVerfiyFail()); } catch (Exception e) { LOGGER.error(e.getMessage(),e); } } ~~~ ***ExcelImportResult*** 我们会返回一个ExcelImportResult 对象,比我们平时返回的list多了一些元素 ~~~ /** * 结果集 */ private List<T> list; /** * 是否存在校验失败 */ private boolean verfiyFail; /** * 数据源 */ private Workbook workbook; ~~~ 一个是集合,是一个是是否有校验失败的数据,一个原本的文档,但是在文档后面追加了错误信息 ***注意,这里的list,有两种返回*** * 一种是只返回正确的数据 * 一种是返回全部的数据,但是要求这个对象必须实现IExcelModel接口,如下 ***IExcelModel*** ~~~ public class ExcelVerifyEntityOfMode extends ExcelVerifyEntity implements IExcelModel { private String errorMsg; @Override public String getErrorMsg() { return errorMsg; } @Override public void setErrorMsg(String errorMsg) { this.errorMsg = errorMsg; } } ~~~ **\*IExcelDataModel** 获取错误数据的行号 ~~~ public interface IExcelDataModel { /** * 获取行号 * @return */ public int getRowNum(); /** * 设置行号 * @param rowNum */ public void setRowNum(int rowNum); } ~~~ 需要对象实现这个接口 每行的错误数据也会填到这个错误信息中,方便用户后面自定义处理 看下代码 ~~~ @Test public void baseModetest() { try { ImportParams params = new ImportParams(); params.setNeedVerfiy(true); ExcelImportResult<ExcelVerifyEntityOfMode> result = ExcelImportUtil.importExcelMore( new FileInputStream(new File(PoiPublicUtil.getWebRootPath("import/verfiy.xlsx"))), ExcelVerifyEntityOfMode.class, params); FileOutputStream fos = new FileOutputStream("D:/excel/baseModetest.xlsx"); result.getWorkbook().write(fos); fos.close(); for (int i = 0; i < result.getList().size(); i++) { System.out.println(ReflectionToStringBuilder.toString(result.getList().get(i))); } Assert.assertTrue(result.getList().size() == 4); } catch (Exception e) { LOGGER.error(e.getMessage(),e); } } ~~~ ***IExcelVerifyHandler*** 加入上面的不满足你,你可以用接口实现自己的校验规则,比如唯一性校验,等等,需要返回错误信息和成功与否 ~~~ public interface IExcelVerifyHandler<T> { /** * 导入校验方法 * * @param obj * 当前对象 * @return */ public ExcelVerifyHanlderResult verifyHandler(T obj); } ~~~ 调用顺序是先通用的,再接口,到这里校验的就完整了,下面给大家看下错误的excel返回 ![yy](https://static.oschina.net/uploads/img/201709/18141356_UPlR.png "错误返回")