问题:读取数据的时候,有的表格读取出来的是一个公式,不是我看到的值

解决办法:一:如果是直接读取本地文件的,如下:

InputStream in = new FileInputStream("path/to/your/excel/file.xlsx")) {
            Workbook workbook = WorkbookFactory.create(in);
            FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator();
            for (Sheet sheet : workbook) {
                for (Row row : sheet) {
                    for (Cell cell : row) {
                        if (cell != null) {
                            // 移除公式,只保留计算后的值
                            cell.setCellFormula(null); 
                            // 计算单元格的值
                            evaluator.evaluateFormulaCell(cell);
                            //获取单元格的值
                            String cellValue = getStringCellValue(cell).trim()
                        }
                    }
                }
            }

二:由前端传输文件,通过EasyExcel读取,如下:

 private List<GoodsRecordDTO> parseExcelToOrderDTOList(MultipartFile file) throws IOException {
        ExcelReader reader = ExcelUtil.getReader(file.getInputStream());
        List<String> sheetNames = reader.getSheetNames();
        List<GoodsRecordDTO> read = new ArrayList<>();
        sheetNames.forEach(sheetName -> {
            reader.setSheet(sheetName);
            FormulaEvaluator evaluator = reader.getWorkbook().getCreationHelper().createFormulaEvaluator();
            Sheet sheet = reader.getSheet();
            Row row = this.findHeaderRow(sheet,evaluator);
            String harbour = this.getHarbour(sheet,evaluator);
            int headerRow = row.getRowNum();
            reader.setIgnoreEmptyRow(true);
            Map<String, String> aliasMap = new HashMap<>();
            aliasMap.put("CD", "cd");
            aliasMap.put("Qty", "qty");
            aliasMap.put("Unit", "unit");
            reader.setHeaderAlias(aliasMap);
            // 第一个参数是指表头所在行,第二个参数是指从哪一行开始读取
            List<GoodsRecordDTO> read1 = reader.read(headerRow + 1, headerRow + 2, GoodsRecordDTO.class);
        });
        return read;
    }

//获取某个关键信息
  private String getHarbour (Sheet sheet,FormulaEvaluator evaluator) {
        //关键词1
        String keyWord1 = "FROM";
        //关键词2
        String keyWord2 = "TO";
        //关键词3
        String keyWord3 = "BY";
        String harbour = null;
        for (Row row : sheet) {
            StringBuilder buffer = new StringBuilder();
            for (Cell cell : row) {
                if (cell != null) {
                    cell.setCellFormula(null); // 移除公式,只保留计算后的值
                    evaluator.evaluateFormulaCell(cell); // 计算单元格的值
                    String cellValue = getStringCellValue(cell).trim().toUpperCase();
                    buffer.append(cellValue);
                }
            }
            String line = buffer.toString();
            if (StringUtils.isNotBlank(line)) {
                if (line.contains(keyWord1)&&line.contains(keyWord2)&&line.contains(keyWord3)){
                    String s = line.split(keyWord2)[1];
                    harbour = s.split(keyWord3)[0];
                    return harbour;
                }
            }
        }
        return null;
    }
//定位标题行
 private Row findHeaderRow(Sheet sheet,FormulaEvaluator evaluator) {
        HashSet<Object> requiredHeaders = new HashSet<>();
        requiredHeaders.add("CD");
        requiredHeaders.add("HOME FASHION GOODS AND/OR PARTS");
        requiredHeaders.add("QTY");
        requiredHeaders.add("UNIT");
        for (Row row : sheet) {
            int matchCount = 0;
            for (Cell cell : row) {
                cell.setCellFormula(null); // 移除公式,只保留计算后的值
                evaluator.evaluateFormulaCell(cell); // 计算单元格的值
                String cellValue = getStringCellValue(cell).trim().toUpperCase();
                if (requiredHeaders.contains(cellValue)) {
                    matchCount++;
                }
            }
            // 当匹配到70%以上的标题时判定为标题行
            if (matchCount >= requiredHeaders.size() * 0.7) {
                return row;
            }
        }
        throw new IllegalArgumentException("未找到有效的标题行");
    }

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐