1 java apache excel apache-poi
我有一个程序,它从工作簿中提取数据.其中一个工作表中有一个单元格,它从公式中获取其数据,该公式涉及同一工作簿中的另一个工作表.该工作簿称为"周11.xls",该工作表称为Sat AP.我正在尝试使用以下代码:
HSSFFormulaEvaluator fe = new HSSFFormulaEvaluator(myWorkbook);
HSSFCell cell = myWorkbook.getSheetAt(11).getRow(10).getCell(3);
CellValue cv = fe.evaluate(cell);
Run Code Online (Sandbox Code Playgroud)
我得到错误,它无法解决外部工作簿第11周sat.xls似乎它试图打开第11周sat.xls,它应该尝试打开11.xls周.myWorkbook用于其他功能,它工作正常,所以我知道它没有指向错误的文件.任何帮助将非常感激.谢谢!
根据您的需要,有两种方法可以处理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;
}
Run Code Online (Sandbox Code Playgroud)
(此代码取自POI,ExcelExtractor中的Excel文本提取器代码,如果您想查看其中的示例)
否则,如果要首先更改单元格的值,则需要重新计算公式值.这在POI网站的公式评估页面中有很大的介绍.如果您有外部工作簿引用,就像从错误消息中看到的那样,请不要忘记告诉POI Formula Evaluator如何查找每个外部工作簿的基础文件.