Java使用POI获取Excel公式并计算公式得到计算结果值

在读取excel表格时,单元格内是公式的情况下读取到的是string类型的公式内容,要想直接读取到公式的计算结果(即单元格数值),需另外写方法读取。 

 方法一:在经判断为公式后,进入case 2,读取计算结果,再通过获取行列调用;

case 2: {
                    try {
                        cellValue = cell.getStringCellValue();
                    } catch (IllegalStateException e) {
                        cellValue = String.valueOf(cell.getNumericCellValue());
                    }
                    break;
                }

    public static Workbook readExcelWorkbook(Workbook workbook, FinanceCostingDTO financeCostingDTO) {
        // 循环解析sheet页
        for (int sheetNum = 0; sheetNum < workbook.getNumberOfSheets(); sheetNum++) {
            // 获取第i个sheet页
            Sheet sheet = workbook.getSheetAt(sheetNum);
            // 校验sheet是否合法
            if (isNull(sheet)) {
                continue;
            }
            int firstRowNum = sheet.getFirstRowNum();
            // 获取第一行数据
            Row firstRow = sheet.getRow(firstRowNum);
            if (isNull(firstRow)) {
                logger.warning("解析Excel失败,在第一行没有读取到任何数据!");
                continue;
            }

                // 汇总表
                String sheetName = sheet.getSheetName();
                if ("汇总表".equals(sheetName)) {
                    // 解析每一行的数据,构造数据对象
                    // Excel第一行标题对应计算机的第0行,具体数据行需要+1
                    int rowStart = firstRowNum + 1;
                    int rowEnd = sheet.getPhysicalNumberOfRows();
                    for (int i =2;i<rowEnd-rowStart;i++)
                    {
                        // 获取一行数据  枚举类中行号为Excel中行号
                        Row row = sheet.getRow(i);
                        // 获取第i列
                        Cell cell = row.getCell(3);
                        String cellValue = getCellValue(cell);
                        if (isNull(cellValue))
                        {
                            continue;
                        }
                        System.out.println(cellValue);
                    }
                }
        return null;
    }

方法二:获取公式后进行计算,再调用计算结果。


          // 后面使用它来执行计算公式
          FormulaEvaluator formulaEvaluator = new XSSFFormulaEvaluator((XSSFWorkbook) workbook);
          CellType cellType = cell.getCellType();
          if (cellType.equals(CellType.FORMULA)) {
              // 获取公式,可以理解为已String类型获取cell的值输出
              String cellFormula = cell.getCellFormula();
              System.out.println(cellFormula);
              // 执行公式,此处cell的值就是公式
              CellValue evaluate = formulaEvaluator.evaluate(cell);
              System.out.println(evaluate.formatAsString());
          }

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值