我有一个程序,它从工作簿中提取数据。其中一个工作表中有一个单元格,它从公式中获取数据,该公式涉及同一工作簿中的另一个工作表。该工作簿称为“周11.xls”,该工作表称为Sat AP。我正在尝试使用以下代码:
HSSFFormulaEvaluator fe = new HSSFFormulaEvaluator(myWorkbook);
HSSFCell cell = myWorkbook.getSheetAt(11).getRow(10).getCell(3);
CellValue cv = fe.evaluate(cell);
我得到的错误是它无法解析外部工作簿第11周sat.xls似乎它试图打开第11周sat.xls,它应该尝试打开11.xls周。 myWorkbook用于其他功能,它工作正常,所以我知道它没有指向错误的文件。任何帮助将非常感激。谢谢!
答案 0 :(得分:5)
根据您的需要,有两种方法可以处理POI中的公式单元格。出于性能原因,当Excel写入公式单元格时,它会计算当前值并将其与公式一起存储。
如果您没有对文件进行更改,那么您只需从上次Excel处理文件时检索缓存值,然后使用它。您将获得与Excel中显示的值相同的值,您无需进行任何评估。您的代码看起来像
if(cell.getCellType() == HSSFCell.CELL_TYPE_FORMULA) {
switch(cell.getCachedFormulaResultType()) {
case HSSFCell.CELL_TYPE_STRING:
HSSFRichTextString str = cell.getRichStringCellValue();
if(str != null && str.length() > 0) {
text.append(str.toString());
}
break;
case HSSFCell.CELL_TYPE_NUMERIC:
HSSFCellStyle style = cell.getCellStyle();
if(style == null) {
text.append( cell.getNumericCellValue() );
} else {
text.append(
_formatter.formatRawCellContents(
cell.getNumericCellValue(),
style.getDataFormat(),
style.getDataFormatString()
)
);
}
break;
case HSSFCell.CELL_TYPE_BOOLEAN:
text.append(cell.getBooleanCellValue());
break;
case HSSFCell.CELL_TYPE_ERROR:
text.append(ErrorEval.getText(cell.getErrorCellValue()));
break;
}
(此代码取自POI,ExcelExtractor中的Excel文本提取器代码,如果您想查看正在使用的示例)
否则,如果要首先更改单元格的值,则需要重新计算公式值。这主要在formula evaluation page on the POI site中介绍。如果您有外部工作簿引用,就像从错误消息中看到的那样,请不要忘记告诉POI Formula Evaluator如何查找每个外部工作簿的基础文件。