使用POI导入解析excel文件

发布于:2025-07-01 ⋅ 阅读:(22) ⋅ 点赞:(0)

 

 首先校验

 

    /**
     * 校验导入文件
     * @param file 上传的文件
     * @return 校验结果,成功返回包含成功状态的AjaxResult,失败返回包含错误信息的AjaxResult
     */
    private AjaxResult validateImportFile(MultipartFile file) {
        if (file.isEmpty()) {
            return AjaxResult.error("文件不能为空");
        }

        String filename = file.getOriginalFilename();
        if (filename == null || !(filename.endsWith(".xlsx") || filename.endsWith(".xls"))) {
            return AjaxResult.error("仅支持Excel文件");
        }

        return AjaxResult.success();
    }

 通过进行解析

    @Override
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult importWnList(@RequestParam("file") MultipartFile file) {
        // 1. 校验文件
        AjaxResult validateResult = validateImportFile(file);
        if (!validateResult.isSuccess()) {
            return validateResult;
        }
        try {
            // 2. 解析Excel
            List<Wn> dataList = parseExcel(file);
            // 3. 处理业务逻辑
            Map<String, Object> importResult = saveListData(dataList);
            // 4. 构建返回消息
            return buildImportResult(importResult);
        } catch (Exception e) {
            return AjaxResult.error("导入失败: " + e.getMessage());
        }
    }

 

    public List<Wn> parseExcel(MultipartFile file) throws IOException {
        List<Wn> list = new ArrayList<>();
        DataFormatter formatter = new DataFormatter();
        Workbook workbook = WorkbookFactory.create(file.getInputStream());
        Sheet sheet = workbook.getSheet("微脑列表");
        // 如果找不到指定名称的工作表,则获取第一个工作表
        if (sheet == null) {
            log.info("找不到名为'微脑列表'的工作表,将使用第一个工作表");
            sheet = workbook.getSheetAt(0);

            // 检查第一个工作表是否存在
            if (sheet == null) {
                throw new IllegalArgumentException("Excel文件中不包含任何工作表");
            }
        }
        for (Row row : sheet) {
            if (row.getRowNum() == 0) continue; // 跳过表头
            Wn wn = new Wn();
            wn.setWnNum(formatter.formatCellValue(row.getCell(0)));
            wn.setWnSn(formatter.formatCellValue(row.getCell(1)));
            wn.setWnType(formatter.formatCellValue(row.getCell(2)));
            wn.setAreaId(formatter.formatCellValue(row.getCell(3)));
            list.add(wn);
        }
        workbook.close();
        return list;
    }

最后保存逻辑

    public Map<String, Object> saveListData(List<Wn> dataList) {
        // 参数校验
        if (CollectionUtils.isEmpty(dataList)) {
            return Collections.singletonMap("message", "数据列表不能为空");
        }
        HashSet<Long> TempidList = new HashSet<>();
        // 初始化统计结果
        int successCount = 0;
        int failCount = 0;
        List<String> failReasons = new ArrayList<>();

        dataList.forEach(wn -> {
            String wnType = wn.getWnType();
            WnTemplate wnTemplateA = new WnTemplate();
            wnTemplateA.setId(Long.valueOf(wnType));
            List<WnTemplate> wnTemplates = wnTemplateMapper.selectWnTemplateList(wnTemplateA);
            TempidList.add(wnTemplates.get(0).getId());

        });
        // 优化:先加载所有模板信息到Map,避免循环内重复查询
        Map<Long, WnTemplate> templateMap = loadTemplateMapByType(TempidList
                );

        // 遍历处理每条数据
        for (int i = 0; i < dataList.size(); i++) {
            Wn wn = dataList.get(i);
            try {
                // 1. 输入参数基础校验
                validateWnData(wn);

                // 2. 唯一性校验(示例校验name和code组合唯一)
                if (selectWnByWnNum(wn.getWnNum()) != null) {
                    throw new RuntimeException("微脑编号已存在"+wn.getWnNum());
                }

                // 3. 校验:微脑模板是否存在(从预加载的Map中获取)
                String wnType = wn.getWnType();
                WnTemplate wnTemplate = new WnTemplate();
                wnTemplate.setId(Long.valueOf(wnType));
                List<WnTemplate> wnTemplates = wnTemplateMapper.selectWnTemplateList(wnTemplate);
                WnTemplate wnTemplateB = templateMap.get(wnTemplates.get(0).getId());
                if (wnTemplateB == null) {
                    throw new RuntimeException("该模板不存在:" + wn.getWnType());
                }
                wn.setWnType(wnTemplateB.getName());
                wn.setStatus("0");
                // 4. 插入数据
                insertWn(wn);
                if (StringUtils.isEmpty(wn.getQrCode())){
                    String url=qrcode(wn.getId());
                    wn.setQrCode(url);
                    wnMapper.updateWn(wn);
                }
                for (WnTemplateSensors wnTemplateSensors : wnTemplateB.getSensorsList()) {
                    Sensors sensors = new Sensors();
                    sensors.setSensorType(wnTemplateSensors.getSensorType());
                    sensors.setWnId(wn.getId());
                    sensors.setCreateTime(DateUtils.getNowDate());
                    sensors.setSensorNid(wnTemplateSensors.getSensorNid());
                    sensorsMapper.insertSensors(sensors);
                }
                successCount++;
            } catch (Exception e) {
                failCount++;
                failReasons.add(failCount + ") 第" + (i + 2) + "行数据错误:" + e.getMessage());
            }
        }

        // 返回结构化结果
        Map<String, Object> result = new HashMap<>();
        result.put("successCount", successCount);
        result.put("failCount", failCount);
        result.put("failReasons", failReasons);
        return result;
    }

构建返回信息

    /**
     * 构建导入结果返回对象
     * @param importResult 导入结果Map,包含successCount、failCount和failReasons
     * @return 导入结果对象
     */
    private AjaxResult buildImportResult(Map<String, Object> importResult) {
        // 从Map中提取结果数据
        Integer successCount = (Integer) importResult.getOrDefault("successCount", 0);
        Integer failCount = (Integer) importResult.getOrDefault("failCount", 0);
        List<String> failReasons = (List<String>) importResult.get("failReasons");
        // 构建返回消息
        String message;
        if(failCount.equals(0)){
            message = String.format(
                    "导入完成!成功 %d 条,失败 %d 条。",
                    successCount,
                    failCount
            );
            return AjaxResult.success(message)
                    .put("successCount", importResult.get("successCount"))
                    .put("failCount", failCount);
        }else{
            message = String.format(
                    "导入完成!成功 %d 条,失败 %d 条。\n失败原因:\n%s",
                    successCount,
                    failCount,
                    String.join("\n", failReasons)
            );
            return AjaxResult.success(message)
                    .put("successCount", importResult.get("successCount"))
                    .put("failCount", importResult.get("failCount"))
                    .put("details", importResult.get("failReasons"));
        }
    }


网站公告

今日签到

点亮在社区的每一天
去签到