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:
}
}
}