ApacheJakarta POI(Java访问微软格式文件的API集)项目为我们提供了一个在Java中跨平台访问Excel文件的框架,但是在之前的版本中对于Excel表中的公式列一直都不方便读取,目前的处于开发状态中的POI3.0Alpha2给我们提供了一个方便的计算公式列的类:org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator,使用的方法见这里,但是如果按官方的说明使用的话你会得到一个空指针错误,还好这是开源的产品,原来是HSSFFormulaEvaluator.evaluate(cell),需要读取当前单元格对于的行,而官方的例子中并没有指定row,所以会出现空指针错误。正确的使用方法如下:

FileInputStream fis = new FileInputStream("c:/temp/test.xls");
HSSFWorkbook wb = new HSSFWorkbook(fis);
HSSFSheet sheet = wb.getSheetAt(0);
HSSFFormulaEvaluator evaluator = new HSSFFormulaEvaluator(sheet, wb);

// suppose your formula is in B3
CellReference cellReference = new CellReference("B3");
HSSFRow row = sheet.getRow(cellReference.getRow());
HSSFCell cell = row.getCell(cellReference.getCol());
//设置单元格所在行
evaluator.setRow(row);
HSSFFormulaEvaluator.CellValue cellValue = evaluator.evaluate(cell);

switch (cellValue.getCellType()) {
	case HSSFCell.CELL_TYPE_BOOLEAN:
    	System.out.println(cellValue.getBooleanValue());
    	break;
	case HSSFCell.CELL_TYPE_NUMERIC:
    	System.out.println(cellValue.getNumberValue());
    	break;
	case HSSFCell.CELL_TYPE_STRING:
    	System.out.println(cellValue.getStringValue());
    	break;
	case HSSFCell.CELL_TYPE_BLANK:
    	break;
	case HSSFCell.CELL_TYPE_ERROR:
    	break;

	// CELL_TYPE_FORMULA will never happen
	case HSSFCell.CELL_TYPE_FORMULA:
    	break;
}

PS:org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator目前在POI的scratchpad区域中,所以如果你要使用它,必须将poi-scratchpad-3.0-alpha2-20060616.jar加到你的类路径中