为了大家能更好地理解这篇博文,在看之前,建议去看看我的上一篇博文:【File】使用 SpringBoot 实现文件的上传与下载。因为,这篇博文是在上一篇博文基础之上继续开发的。
这两篇博文互有联系:文件的导入就是文件的上传;文件的导出就是文件的下载。
至于为什么是 导入/导出 Excel 文件呢?因为 Excel 文件用的频率更多吧。顺便来复习下通过 EasyExcel
来操作 Excel 文件。
编码思路:
Excel 导入:
- 浏览文件夹,选择需要上传的 Excel 文件,这里使用 POSTMAN 工具;
- 将本地文件上传至服务器指定位置;
- 服务器解析Excel文件;
- 将Excel中解析的数据存入数据库中。
Excel 导出
- 设定查询条件;
- 数据库中查询相应的数据 ;
- 将数据写入Excel;
- 将 Excel 下载至本地。
导入 POM 依赖:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.0.0-beta2</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.5</version>
</dependency>
1. Excel 导入
FileController
:添加一个导入接口
@RestController
@RequestMapping("/file")
public class FileController {
@Autowired
private FileService fileService;
@PostMapping("/importExcel")
public ResultVo importExcel(@RequestParam("file") MultipartFile excel) {
return fileService.importExcel(excel);
}
}
FileServiceImpl
:
@Service
@Slf4j
public class FileServiceImpl implements FileService {
@Autowired
private ExcelUtil excelUtil;
@Override
public ResultVo importExcel(MultipartFile file) {
// 1.入参校验
ResultVo<String> checkExcelParam = checkExcelParam(file);
if (!checkExcelParam.checkSuccess()) {
log.error(checkExcelParam.getMsg());
return checkExcelParam;
}
// 2.上传至服务器某路径下
ResultVo resultVo = uploadFile(file);
if (!resultVo.checkSuccess()) {
return resultVo;
}
String filePath = (String)resultVo.getData();
if (StringUtil.isBlank(filePath)) {
return ResultVoUtil.error("【导入Excel文件】生成的Excel文件的路径为空");
}
// 3.读取excel文件
List<ExcelVo> excelVos = excelUtil.simpleExcelRead(filePath, ExcelVo.class);
if (CollectionUtil.isEmpty(excelVos) || excelVos.size() < 2) {
log.error("【导入Excel文件】上传Excel文件{}为空", file.getOriginalFilename());
return ResultVoUtil.error("上传Excel文件为空");
}
// 4.通过线程池开启一个线程去执行数据库操作,主线程继续往下执行
// 4.1开启一个线程
TaskCenterUtil taskCenterUtil = TaskCenterUtil.getTaskCenterUtil();
taskCenterUtil.submitTask(() -> {
log.info("【批量添加】批量添加数据:{}", JSON.toJSONString(excelVos));
return null;
});
// 4.2删除临时文件
boolean deleteFile = FileUtil.deleteFile(new File(filePath));
if (!deleteFile) {
log.error("【导入Excel文件】删除临时文件失败,临时文件路径为{}", filePath);
return ResultVoUtil.error("删除临时文件失败");
}
log.info("【导入Excel文件】删除临时文件成功,临时文件路径为:{}", filePath);
return ResultVoUtil.success(excelVos);
}
}
说明:
List<ExcelVo> excelVos = excelUtil.simpleExcelRead(filePath, ExcelVo.class);
你给我一个Excel文件路径,和一个数据类型,我就能将这个Excel文件中的数据封装成一个集合,并返回给你;TaskCenterUtil taskCenterUtil = TaskCenterUtil.getTaskCenterUtil();
获取了一个线程池;taskCenterUtil.submitTask()
另开启了一个新线程去执行其它操作;原来的线程继续往下执行