实现将用户提交到后端的excel文件解析出来,并保存到数据库中。

首先需要导入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();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值