首先需要导入maven依赖:
<!-- 解析xls文件 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.1</version>
</dependency>
<!-- poi库 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.1</version>
</dependency>
考虑到代码量大,所以我将代码写到了service层。说明和注释都在代码里了。
@Service
@Slf4j
@RequiredArgsConstructor
public class UserService extends ServiceImpl<UserMapper, User> {
@Transactional(rollbackFor = Exception.class)
public Result fill_xlsx(MultipartFile multipartFile) throws IOException {
//接下里都是在生成文件名,其中使用到了UUID生成随机的文件名。
//这一步准备在从项目目录下的resource目录下写入临时文件
String address = new ApplicationHome(this.getClass()).getDir().getParentFile().getParentFile().getAbsolutePath() + "\\src\\main\\resources\\static\\UserExcels\\";
int index = multipartFile.getOriginalFilename().lastIndexOf(".");
String extname = multipartFile.getOriginalFilename().substring(index);
String newFileName = UUID.randomUUID().toString() + extname;
log.info("截取后的原文件名{}",extname);
log.info("UUID后的文件名{}",newFileName);
//保存到项目目录下的resource/static目录
multipartFile.transferTo(new File(address + newFileName));
//开始提取文件,准备解析
FileInputStream in = new FileInputStream(new File(address + newFileName));
XSSFWorkbook excel = new XSSFWorkbook(in);
//读取第一页
XSSFSheet sheetAt = excel.getSheetAt(0);
//拿到一共有多少行
int lastRowNum = sheetAt.getLastRowNum();
//定义对象
User[] user = new User[lastRowNum];
for(int i=0;i<user.length;i++)
user[i]=new User();
//开始提取,这里有些复杂,原因是这里进行了正则表达式,因为用户提交上来的数据是不可靠的。
for (int i = 1; i <= lastRowNum; i++) {
XSSFRow row = sheetAt.getRow(i);
String regex = "^[0-9]+$";//判断是否非数字
row.getCell(0).setCellType(CellType.STRING);
row.getCell(1).setCellType(CellType.STRING);
row.getCell(2).setCellType(CellType.STRING);
row.getCell(3).setCellType(CellType.STRING);
row.getCell(4).setCellType(CellType.STRING);
row.getCell(5).setCellType(CellType.STRING);
String value = row.getCell(0).getStringCellValue();
if(!value.matches(regex)){
return Result.error("");
}
user[i-1].setId(Integer.valueOf(value));
String value1 = row.getCell(1).getStringCellValue();
user[i-1].setUsername(value1);
String value2 = row.getCell(2).getStringCellValue();
String value3 = row.getCell(3).getStringCellValue();
log.info("{}{}{}{}{}{}",value,value1,value2,value3);
String regex_bat = "^\\d+(\\.\\d+)?$";//判断是否非小数
if (!value2.matches(regex_bat)){
return Result.error("");
}
user[i-1].setPassword(value2);
if (!value3.matches(regex_bat)){
return Result.error("");
}
}
saveBatch(Arrays.asList(user));//用mabatisplus提供的方法完成新增数据到数据库,也完全可以自己写一个
//不关流会一直占用文件,导致没法删除
excel.close();
in.close();
//删除提交上来的文件
File file = new File(address + newFileName);
// 路径为文件且不为空则进行删除
if (file.isFile() && file.exists()) {
boolean resultDelete = file.delete();
if(!resultDelete){
return Result.error("意料之外的错误!");//切记关流,不然会走到这一步
}
}else{
return Result.error("意料之外的错误!");
}
return Result.success();
}
}