在读取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());
}