观看本文需要掌握EasyExcel基础使用,想要快速入门EasyExcel的可以看我以往的一篇文章
(拿去CV就能用!)EasyExcel读写Excel详细流程(图解+代码)https://blog.csdn.net/weixin_73077810/article/details/131786254
思路分析
我们解析Excel文件的前提是找到这个excel文件,但是现在这Excel文件是通过前端传过来的,我们采用MultipartFile来进行接收。但是MultipartFile没有提供获取文件路径的方法。 如果需要获取文件路径,可以使用MultipartFile的transferTo()方法将文件上传到本地,并使用 File类的getPath()方法获取文件路径
代码如下(直接上CV大法的啦!):
Controller
@PostMapping("batchAddCardData")
@ApiOperation("批量添加名片数据")
public ResponseVO<String> batchAddCardData(@RequestParam("file") MultipartFile file) {
try {
boolean flag = cardInfoService.batchAddCardData(file);
if (!flag){throw new Exception();}
return ResponseVO.getSuccessResponseVo(null, "批量添加成功");
} catch (Exception e) {
throw new BusinessException("批量添加失败,注意选择excel文档");
}
}
Service
@Override
@Transactional(rollbackFor = Exception.class)
public boolean batchAddCardData(MultipartFile file) {
try {
// 获取目标文件夹位置
File folder = new File("src/main/java/com/pi/namecardadmin/excel");
if (!folder.exists()){
folder.mkdirs();
}
File dest = new File(folder.getAbsolutePath());
// 将文件写入到目标文件夹
file.transferTo(dest);
List<CardInfo> cardInfos = ExcelUtil.getDataFromExcel(CardInfo.class, dest.getPath());
cardInfos.stream()
.parallel()
.peek(cardInfo -> {
cardInfo.setCardId(generateShortId());
cardInfoMapper.insert(cardInfo);
})
.count();
// 删除该临时文件
dest.delete();
return true;
} catch (IOException e) {
throw new RuntimeException(e);
}
}
/**
采用UUID获取唯一的CardId
*/
public static String generateShortId() {
UUID uuid = UUID.randomUUID();
long mostSigBits = uuid.getMostSignificantBits();
long leastSigBits = uuid.getLeastSignificantBits();
// 将 UUID 的最高位和最低位转换成 16 进制字符串
String mostSigHex = Long.toHexString(mostSigBits);
String leastSigHex = Long.toHexString(leastSigBits);
// 拼接最高位和最低位,并截取前11位作为最终的短 ID
String shortId = mostSigHex + leastSigHex;
return shortId.substring(0, 11);
}
注意哦,如果在transferTo(dest);那里报文件找不到的异常,可以看我下面的这篇文章(多周到,不信学不会)
给个关注呗~