1.功能实现:把excel表格的数据导入数据库,对于数据库有的数据,跳过不导入,不重复的数据插入数据库。对于业务校验、重复的数据在导入后返回一个excel表格,全部正常导入返回200
2.技术实现:EasyPOi、异步化
一、maven配置
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-base</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-web</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-annotation</artifactId>
<version>3.3.0</version>
</dependency>
二、实现
1.excel对应的实体类,并做相应的业务校验。实体类实现IExcelDataModel, IExcelModel这两个接口
2.导入实现
1)contorller层
service层省略
最重要的实现类 Impl
ImportParams params = new ImportParams();
params.setTitleRows(1);
params.setHeadRows(1);
params.setStartRows(2);
params.setNeedVerfiy(true);
params.setVerifyHandler(pmsBunkImportHandler);
ExcelImportResult<PmsMallBunkImportMapDTO> result=null;
try {
result = ExcelImportUtil.importExcelMore(file.getInputStream(), PmsMallBunkImportMapDTO.class, params);
} catch (Exception e) {
e.printStackTrace();
}
List<PmsMallBunkImportMapDTO> list = result.getList();
List<PmsMallBunk> pmsMallBunks = pmsMallBunkMapper.selectAllBunkCode();
List<String> collectCodes = pmsMallBunks.stream().map(PmsMallBunk::getBunkCode).collect(Collectors.toList());
//入库
for (PmsMallBunkImportMapDTO mallBunkImportMapDTO:list){
String bunkCode = String.format(mallBunkImportMapDTO.getMallName() + mallBunkImportMapDTO.getFloorNo() + mallBunkImportMapDTO.getAreaCode() + mallBunkImportMapDTO.getBunkCategory() + "-" + mallBunkImportMapDTO.getStallCode());
if (collectCodes.contains(bunkCode)){
continue;
}
pmsBunkExcelImportTask.asyncExcelImport(mallBunkImportMapDTO,bunkCode);
}
List<PmsMallBunkImportMapDTO> failList = result.getFailList();
//验证是否有失败的数据
String fileName="导入失败的信息";
if (result.isVerfiyFail()) {
ServletOutputStream fos = resp.getOutputStream();
//mime类型
resp.setCharacterEncoding("UTF-8");
resp.setHeader("content-type", "application/octet-stream;charset=UTF-8");
resp.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8") + ".xls");
resp.setContentType("application/octet-stream;charset=UTF-8");
result.getFailWorkbook().write(fos);
fos.close();
}
2)excel业务校验handler类,实现 IExcelVerifyHandler接口
3.为了提交插入的效率,使用线程池异步插入数据库,具体参考spring+线程池相关文章。
Impl实现类中的 pmsBunkExcelImportTask.asyncExcelImport(mallBunkImportMapDTO,bunkCode)方法
线程池相关配置
3.测试
excel的数据如下
初次导入成功!
再次导入!出现Download file表示有错误的数据!点击下载
打开后如下,其他校验也是同样效果,至此完成批量导入excel的功能