功能背景
我需要导入大量的IMEI号到数据库中,用于控制哪些设备是可以升级的。
用户使用流程: - 从后台下载一个模板 - 填写模板里的内容 - 上传excel文件
功能分析
首先是下载模板,其实就是我返回一个写好特定特使的excel文件。
然后是上传文件,解析,数据检查,然后入库。
EasyExcel
添加依赖
<!--excel-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>
编写Bean类
@Data
public class GroupDeviceImportVo {
@ExcelProperty(value = "目标ID", index = 2)
private String targetId;
@ExcelProperty(value = "类型", index = 1)
private String type;
@ExcelProperty(value = "设备组ID", index = 0)
private String groupId;
}
写操作
这里的写操作,也就相当于我要生成模板内容了
- 控制器
@GetMapping("/admin/group-device/import-template")
public ResponseEntity<byte[]> downloadDeviceImportTemplate() {
return groupDeviceService.createImportTemplate();
}
- 数据写入
@Override
public ResponseEntity<byte[]> createImportTemplate() {
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentDispositionFormData("attachment", "template.xls");
httpHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
EasyExcel.write(byteArrayOutputStream, GroupDeviceImportVo.class).sheet().doWrite(createList());
return new ResponseEntity<>(byteArrayOutputStream.toByteArray(), httpHeaders, HttpStatus.OK);
}
private List<GroupDeviceImportVo> createList() {
List<GroupDeviceImportVo> result = new ArrayList<>();
GroupDeviceImportVo groupDeviceImportVo = new GroupDeviceImportVo();
groupDeviceImportVo.setGroupId("填写设备组ID");
groupDeviceImportVo.setType("填写app,或者watchOs");
groupDeviceImportVo.setTargetId("app则填写用户ID,watchOS则填写手表的IMEI号");
result.add(groupDeviceImportVo);
return result;
}
这样子,前端访问接口,就可以下载一个模板文件了。
读取操作
- 控制器
@ApiOperation(value = "导入设备", notes = "步骤:上传excel文件,然后得到地址,把这个地址提交上来解析")
@ApiImplicitParams({
@ApiImplicitParam(name = "devicesFile", value = "设备文件地址"),
@ApiImplicitParam(name = "groupId", value = "设备组ID")
})
@PostMapping("/admin/group-device/import/{groupId}")
public ICResponse importDevices(@PathVariable("groupId") String groupId,
@RequestParam("devicesFile") MultipartFile devicesFile) {
try {
groupDeviceService.importDevicesFile(groupId, devicesFile);
} catch (Exception e) {
e.printStackTrace();
return ICResponse.failed("文件解析异常.");
}
return ICResponse.ok("设备导入成功.");
}
- 文件解析
@Override
public void importDevicesFile(String groupId, MultipartFile devicesFile) throws IOException {
log.info("devicesFile==>" + devicesFile.getSize());
List<GroupDeviceImportVo> resultList = new ArrayList<>();
InputStream inputStream = devicesFile.getInputStream();
EasyExcel.read(inputStream, GroupDeviceImportVo.class, new AnalysisEventListener<GroupDeviceImportVo>() {
@Override
public void invoke(GroupDeviceImportVo o, AnalysisContext analysisContext) {
log.info("item==> " + o);
resultList.add(o);
}
@Override
public void invokeHead(Map map, AnalysisContext analysisContext) {
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
//数据入库
log.info("result size==> " + resultList.size());
handleImportResult(resultList, groupId);
}
}).sheet().doRead();
}
okay,到这里就完成了excle文件的导入导出操作了。