使用Poi处理Excel时,发现如果使用Poi编辑了某个单元格A,另一个单元格B是公式并且依赖于这个单元格A,则必须打开Excel,使单元格A获得焦点,然后再移开焦点才能使公式有效。
解决方法是,Poi中提供了org.apache.poi.ss.usermodel.FormulaEvaluator这个接口,实现对公式的更新。其中HSSFFormulaEvaluator, XSSFFormulaEvaluator 实现了这个接口。通过构造方法可以得到一个HSSFFormulaEvaluator的实例。
FormulaEvaluator提供了evaluateFormulaCell(Cell cell)方法,计算公式保存结果,但不改变公式。而evaluateInCell(Cell cell) 方法是计算公式,并将原公式替换为计算结果,也就是说该单元格的类型不在是Cell.CELL_TYPE_FORMULA而是Cell.CELL_TYPE_NUMBERIC。HSSFFormulaEvaluator提供了静态方法evaluateAllFormulaCells(HSSFWorkbook wb) ,计算一个Excel文件的所有公式,用起来很方便。下面例子是提供公式更新的一个方法,传入Workbook,Sheet和行下标row,然后更新相应行的所有公式。