Required dependencies:
<!--easypoi-->
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-base</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-web</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-annotation</artifactId>
<version>4.0.0</version>
</dependency>
<!--MVEL处理依赖-->
<dependency>
<groupId>org.mvel</groupId>
<artifactId>mvel2</artifactId>
<version>2.0.19</version>
</dependency>
easypoi import excel template class:
@Data
public class Order implements Serializable {
@Excel(name = "寄件人姓名")
@NotNull(message = "寄件人姓名不能为空" ,groups = {ViliGroupOne.class})
private String senderName;
@Excel(name = "寄件人联系方式")
@NotNull(message = "寄件人联系方式不能为空" ,groups = {ViliGroupOne.class})
@IsMobile(message = "寄件人联系方式输入错误", groups = {ViliGroupOne.class})
private String senderPhone;
@Excel(name = "寄件人省市区")
@NotNull(message = "寄件人省市区不能为空" ,groups = {ViliGroupOne.class})
private String senderProvinces;
@Excel(name = "收件人姓名")
@NotNull(message = "收件人姓名不能为空" ,groups = {ViliGroupOne.class})
private String receiverName;
@Excel(name = "收件人联系方式")
@NotNull(message = "收件人联系方式不能为空" ,groups = {ViliGroupOne.class})
@IsMobile(message = "收件人联系方式输入错误", groups = {ViliGroupOne.class})
private String receiverPhone;
@Excel(name = "收件人省市区")
@NotNull(message = "收件人省市区不能为空" ,groups = {ViliGroupOne.class})
private String receiverProvinces;
}
Template class extension; get an error message, line number, custom JSR cross-validation required fields (fields resolve downtown province, assigned to the corresponding entity, for more entity)
@Data
@ParseProvinces.List({
@ParseProvinces(provinces = "senderProvinces", provincesVo = "senderProvincesVo", message = "寄件人省市区解析失败,请按要求填写", groups = {ViliGroupOne.class}),
@ParseProvinces(provinces = "receiverProvinces", provincesVo = "receiverProvincesVo", message = "收件人省市区解析失败,请按要求填写", groups = {ViliGroupOne.class})
})
public class OrderOfMode extends Order implements IExcelModel, IExcelDataModel {
private String errorMsg;
private int rowNum;
private ProvincesVo senderProvincesVo;
private ProvincesVo receiverProvincesVo;
}
Custom Validator annotations JSR resolve
@Target({TYPE, METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER})
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = {ParseProvincesValidator.class})
public @interface ParseProvinces {
boolean required() default true;
String message() default "";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
String provinces();
String provincesVo();
@Target({TYPE, ANNOTATION_TYPE})
@Retention(RUNTIME)
@Documented
@interface List
{
ParseProvinces[] value();
}
}
Since processing method defined JSR annotation validator (implemented)
public class ParseProvincesValidator implements ConstraintValidator<ParseProvinces, Object> {
String regex = "(?<province>[^省]+自治区|.*?省|.*?行政区|.*?市)"
+ "(?<city>[^市]+自治州|.*?地区|.*?行政单位|.+盟|市辖区|.*?市|.*?县)"
+ "(?<county>[^县]+县|.+区|.+市|.+旗|.+海域|.+岛)?(?<town>[^区]+区|.+镇)?(?<village>.*)";
private String provinces;
private String provincesVo;
private boolean required = false;
@Override
public void initialize(ParseProvinces constraintAnnotation) {
this.provinces = constraintAnnotation.provinces();
this.provincesVo = constraintAnnotation.provincesVo();
required = constraintAnnotation.required();
}
@Override
public boolean isValid(Object value, ConstraintValidatorContext context) {
Object provincesObj = MVEL.getProperty(provinces, value);
Object provincesVoObj = MVEL.getProperty(provincesVo, value);
if (required) {
return parseProvinces(value);
} else {
if (value == null) {
return true;
} else {
return parseProvinces(value);
}
}
}
private boolean parseProvinces(Object param) {
//解析,执行所需操作
//dosomthing
Object provincesObj = MVEL.getProperty(provinces, param);
String province = null;
String city = null;
String county = null;
Matcher m = Pattern.compile(regex).matcher(provincesObj.toString());
while (m.find()) {
province = m.group("province");
city = m.group("city");
county = m.group("county");
}
LibArea libAreaProvice = null;
LibArea libAreaCity = null;
LibArea libAreaCounty = null;
if (province != null && city != null && county != null) {
if (province.contains("上海") || province.contains("北京")
|| province.contains("天津") || province.contains("重庆")) {
province = province.substring(0, province.indexOf("市"));
}
province = province.trim();
city = city.trim();
county = county.trim();
libAreaProvice = LocalCache.get(province, 1, 100000);
if (libAreaProvice != null) {
libAreaCity = LocalCache.get(city, 2, libAreaProvice.getId());
if (libAreaCity != null) {
libAreaCounty = LocalCache.get(county, 3, libAreaCity.getId());
}
}
}
if (libAreaProvice != null && libAreaCity != null && libAreaCounty != null) {
ProvincesVo p = new ProvincesVo();
p.setProvince(libAreaProvice.getName());
p.setProvinceId(libAreaProvice.getId());
p.setCity(libAreaCity.getName());
p.setCityId(libAreaCity.getId());
p.setCounty(libAreaCounty.getName());
p.setCountyId(libAreaCounty.getId());
MVEL.setProperty(param, provincesVo, p);
return true;
} else {
return false;
}
}
}
Verify group (effect is unclear, but there is no verification of this information does not take effect)
public interface ViliGroupOne {
}
Test category
@Test
public void importVerifyTestByOrder() {
String filePath = "E:\\Work\\Ksudi\\Soms\\template\\ORDER_TEMPLATE.xls";
ExcelImportResult<OrderOfMode> result = EasyPoiUtil.importExcelVerify(filePath, OrderOfMode.class, new Class[]{ViliGroupOne.class});
List<OrderOfMode> list = result.getList();
List<OrderOfMode> failList = result.getFailList();
list.forEach(success -> {
System.out.println("成功数据:" + success.toString());
});
failList.forEach(fail -> {
System.out.println("失败信息:" + fail.toString());
});
}
General generic method, call easypoi
public static <T> ExcelImportResult<T> importExcelVerify(String filePath, Class<T> pojoClass, Class<T>[] verifyClass) {
if (StringUtils.isBlank(filePath)) {
return null;
}
ImportParams params = new ImportParams();
params.setNeedVerify(true);
params.setVerifyGroup(verifyClass);
ExcelImportResult<T> result = null;
try {
result = ExcelImportUtil.importExcelMore(new File(filePath), pojoClass, params);
} catch (Exception e) {
log.error(e.getMessage(), e);
}
return result;
}