记录一下写Excel文件导入数据所经历的问题。
springboot提供的文件处理MultipartFile有关方法,我没有具体看文档,但目测比较复杂,
遂了解学习了一下别的文件上传方法,本文第1节记录的是springboot原始的导入文件方法写法,第二节大概介绍了一下EasyExcel的使用,第三节是EasyExcel的实际使用。
只看实现,请直接跳转第三节。
1 原springboot写法,不使用EasyExcel
看了一下springboot原版写法如下,大致意思是写个工具类ExcelReadUtil来处理文件内容读取和转化,ServiceImpl实现文件存储,代码量很可怕。
1.1 SalaryController
public R<?> addSalaryInfo(@RequestParam("file") MultipartFile file, @RequestParam("importTime") String importTime, @RequestParam("type") Integer type, @RequestParam("fileId") Long fileId) {
salaryService.addSalaryInfo(file, importTime, type, fileId);
return R.ok("操作成功");
}
1.2 ServiceImpl
@Override
@Transactional(rollbackFor = Throwable.class)
public void addSalaryInfo(MultipartFile file, String importTime, Integer type, Long fileId) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
if (file == null || "".equals(file.getOriginalFilename())) {
throw new PMValidationException("上传附件为空");
}
if (StringUtils.isEmpty(type) || Objects.isNull(SalaryType.getByCode(type))) {
throw new PMValidationException("薪酬类型错误");
}
Date importDate;
try {
importDate = sdf.parse(importTime);
} catch (ParseException e) {
throw new PMValidationException("薪酬所属月份格式错误");
}
long loginUserId = userRemoteService.getLoginUser().getData().getUserId();
List<Map<String, Object>> maps = ExcelReadUtil.readExcelByRC(file, 2, -1, true);
SalaryInfo salaryInfo = new SalaryInfo();
salaryInfo.setImportTime(importDate);
salaryInfo.setCreateBy(loginUserId);
salaryInfo.setUpdateBy(loginUserId);
salaryInfo.setType(type);
salaryInfo.setFileId(fileId);
salaryInfoMapper.insert(salaryInfo);
if (SalaryType.PAYABLE_SALARY.getCode() == type) {
insertSalary(maps, loginUserId, importDate, salaryInfo.getId());
} else {
insertOrUpdateOtherSalary(maps, loginUserId, type, importDate);
}
}
public void insertSalary(List<Map<String, Object>> maps, Long loginUserId, Date importDate, Long salaryInfoId) {
List<SalaryData> salaryInfoList = new LinkedList<>();
maps.forEach(map -> {
String deptName = String.valueOf(map.get(SalaryField.DEPT_NAME) == null ? "" : map.get(SalaryField.DEPT_NAME));
String nickName = String.valueOf(map.get(SalaryField.NICK_NAME) == null ? "" : map.get(SalaryField.NICK_NAME));
String userNo = String.valueOf(map.get(SalaryField.USER_NO) == null ? "" : map.get(SalaryField.USER_NO));
BigDecimal salary = null;
if (map.get(SalaryField.SALARY) != null) {
salary = new BigDecimal(String.valueOf(map.get(SalaryField.SALARY)));
}
BigDecimal performance = null;
if (map.get(SalaryField.PERFORMANCE) != null) {
performance = new BigDecimal(String.valueOf(map.get(SalaryField.PERFORMANCE)));
}
BigDecimal seniorityPay = null;
if (map.get(SalaryField.SENIORITY_PAY) != null) {
seniorityPay = new BigDecimal(String.valueOf(map.get(SalaryField.SENIORITY_PAY)));
}
BigDecimal postSalary = null;
if (map.get(SalaryField.POST_SALARY) != null) {
postSalary = new BigDecimal(String.valueOf(map.get(SalaryField.POST_SALARY)));
}
BigDecimal tenementSubsidy = null;
if (map.get(SalaryField.TENEMENT_SUBSIDY) != null) {
tenementSubsidy = new BigDecimal(String.valueOf(map.get(SalaryField.TENEMENT_SUBSIDY)));
}
BigDecimal communicateSubsidy = null;
if (map.get(SalaryField.COMMUNICATE_SUBSIDY) != null) {
communicateSubsidy = new BigDecimal(String.valueOf(map.get(SalaryField.COMMUNICATE_SUBSIDY)));
}
BigDecimal trafficFee = null;
if (map.get(SalaryField.TRAFFIC_FEE) != null) {
trafficFee = new BigDecimal(map.get(SalaryField.TRAFFIC_FEE) == null ? "" : String.valueOf(map.get(SalaryField.TRAFFIC_FEE)));
}
BigDecimal mealFee = null;
if (map.get(SalaryField.MEAL_FEE) != null) {
mealFee = new BigDecimal(String.valueOf(map.get(SalaryField.MEAL_FEE)));
}
BigDecimal changeFee = null;
if (map.get(SalaryField.CHANGE_FEE) != null) {
changeFee = new BigDecimal(String.valueOf