最近公司让我做报表导入,之前没这方面的经验,所以上网找了找文档学习,这过程也踩了不少坑,记录一下避免再犯。
一、添加依赖
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-web</artifactId>
<version>3.0.3</version>
</dependency>
二、编写Entity
这里有个小坑,如果想使用注解校验引入hibernate,而maven实际导入的包中含有hibernate的验证框架,如果再重复依赖则打包会jar包冲突。
/**
* @Author: Chen
* @Date: 2022/3/15 16:57
* @Desc:
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(value = "采购管理规格报表导入")
public class PmsSpecImporExcel {
@ApiModelProperty(name = "index", hidden = true)
@Excel(name="序号")
private int index;
@ApiModelProperty("规格")
@Excel(name="规格")
@NotNull(message = "规格不能为空")
private String spec;
@ApiModelProperty("配置")
@Excel(name="配置")
private String conf;
@ApiModelProperty("税率")
@Excel(name="税率(%)")
private String taxRate;
@ApiModelProperty("含税单价")
@Excel(name="含税参考单价(元)")
private BigDecimal price;
@ApiModelProperty("价格有效期")
@Excel(name="价格有效期")
private String priceVit;
@ApiModelProperty("备注")
@Excel(name="备注")
private String des;
}
三、编写一个Handler
这里有个大坑,如果需要在handler中查询数据库然后对比校验,这样会引入@Autowired需要将Handler也交给Spring管理,mapper才能取到数据;如果不需要自动注入查数据,可以在实现类直接new该自定义类。
/**
* @Author: Chen
* @Date: 2022/3/15 17:17
* @Desc:
*/
@Component
public class SpecExcelHandler implements IExcelVerifyHandler<PmsSpecImporExcel> {
@Autowired
private PmsLxServerSpecMapper pmsLxServerSpecMapper;
@Override
public ExcelVerifyHandlerResult verifyHandler(PmsSpecImporExcel psie) {
ExcelVerifyHandlerResult result = new ExcelVerifyHandlerResult(true);//默认设置验证通过为true
if (StringUtils.isNotBlank(psie.getSpec())) {
PmsServerSpecConfEntity specDate = pmsLxServerSpecMapper.checkSpecificationsNameAll(psie.getSpec());
if (null != specDate) {
result.setSuccess(false);//错误标记,该数据会放在导入的返回集合getFailList()中
result.setMsg("规格名称已存在");
return result;
}
}
//校验price是不是数值
if (!(Pattern.matches("^(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*))$",String.valueOf(psie.getPrice())))) {
result.setSuccess(false);
result.setMsg("含税参考单价(元)单元格不是数值类型");
return result;
}
return result;
}
}
四、编写实现类
如果上传的excel只有一行标题,那么HeadRows设置为1;注意这里需要@Autowired注入Handler
@Override
public WebResponse importSpec(MultipartFile file) {
WebResponse date = new WebResponse();
ImportParams importParams = new ImportParams();
// 数据校验
importParams.setVerifyHandler(specExcelHandler);
importParams.setHeadRows(1);
try {
ExcelImportResult<PmsSpecImporExcel> result = ExcelImportUtil.importExcelMore(file.getInputStream(), PmsSpecImporExcel.class,importParams);
List<PmsSpecImporExcel> successList = result.getList();
List<PmsSpecImporExcel> failList = result.getFailList();
date.setMsg("上传完成,共上传"+String.valueOf(successList.size())+"条数据");
date.setData(successList);
logger.info("是否存在验证未通过的数据:" + result.isVerfiyFail());
logger.info("验证通过的数量:" + successList.size());
logger.info("验证未通过的数量:" + failList.size());
} catch (AppException e) {
logger.error(e.getMessage(), e);
} catch (Exception e) {
e.printStackTrace();
}
return date;
}