poI 读取excell单元格公式的计算的具体值

poi读取excell

poI 读取excell单元格公式的计算的具体值

bug

但是有缺陷,有些公式无法无法读取值,比如字符串连接函数 CONCATENATE

// poI 读取excell单元格公式值
cell.getNumericCellValue()
// poI 读取excell单元格公式
cell.getCellFormula()
                    }

整体的代码

// 根据Workbook得到第0个下标的工作薄
Sheet sheet = _workbook.getSheetAt(sheetIdx);
// 遍历工作薄中的所有行,注意该foreach只有Java5或者以上才支持
for (Row row : sheet) {
    // 遍历行中的所有单元格 Java5+ 才能使用
    for (Cell cell : row) {
        // 单元格的参照 ,根据行和列确定某一个单元格的位置
        CellReference cellRef = new CellReference(row.getRowNum(), cell.getColumnIndex());
        // 得到单元格类型
        String value = null;
        // 这是一个自己写的实体类,用来存储取出来的数据
        CellModel cm = new CellModel();
        cm.setSheetName(sheet.getSheetName());
        cm.setReference(cellRef.formatAsString());
        String key = cm.getFullReference();

        switch (cell.getCellType()) {
        case Cell.CELL_TYPE_NUMERIC:// 数字类型
            cm.setCellType("2");// 常量
            // 检查单元格是否包含一个Date类型
            // 仅仅只检查Excel内部的日期格式,
            if (DateUtil.isCellDateFormatted(cell)) {
                // 输出日期
                Date date = cell.getDateCellValue();
                value = String.valueOf(DateFormat.getFullDatetimeFormatter().format(date));
            } else {
                // 输出数字
                value = String.valueOf(cell.getNumericCellValue());
            }
            cm.setFormula(value);
            rtn.put(key, cm);
            break;
        case Cell.CELL_TYPE_STRING:// 字符类型
            cm.setCellType("2");// 常量
            value = cell.getStringCellValue();
            cm.setFormula(value);
            rtn.put(key, cm);
            break;
        case Cell.CELL_TYPE_FORMULA:// 公式
            cm.setCellType("1");// 公式
            cm.setFormula(cell.getCellFormula());

            String tanslate = translateFormula(cell, cm.getFormula());
            cm.setAviatorFormula(tanslate);
            try {
                /* 如果是公式的话,取一下公式的计算值, 为了对比模型计算值和Excel计算值是否一致 */
                cm.setFormula(String.valueOf(cell.getNumericCellValue()));
            } catch (Exception e) {
                // continue;
            }
            if (tanslate != null) {
                // String key = cm.getFullReference();
                rtn.put(key, cm);
            }
            break;
        default:
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值