如何使用apache poi从公式单元格中读取单元格值
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用apache poi从公式单元格中读取单元格值相关的知识,希望对你有一定的参考价值。
我试图从excel文件中读取所有数据,该文件也有一些公式单元格,但我不知道哪个单元格是公式单元格。如何从细胞中读取所有值,而不管细胞的类型如何。
我的代码看起来像这样
FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator();
while (rows.hasNext()) {
row = (HSSFRow) rows.next();
Iterator cells = row.cellIterator();
while (cells.hasNext()) {
cell = (HSSFCell) cells.next();
if (cell.getCellType() == HSSFCell.CELL_TYPE_STRING) {
ar.add(cell.getStringCellValue());
} else if (cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {
ar.add(cell.getNumericCellValue());
}else if (cell.getCellType() == HSSFCell.CELL_TYPE_FORMULA) {
ar.add(evaluator.evaluateFormulaCell(cell));
} else {
ar.add("");
}
}
}
我将公式单元格值设为0
答案
你正在寻找的方法是Cell.getCachedFormulaResultType - 对于一个公式单元格,它会告诉你公式结果的类型
您的代码可以是这样的:
private void handleCell(int type, Cell cell) {
if (type == HSSFCell.CELL_TYPE_STRING) {
ar.add(cell.getStringCellValue());
} else if (type == HSSFCell.CELL_TYPE_NUMERIC) {
ar.add(cell.getNumericCellValue());
} else if (type == HSSFCell.CELL_TYPE_BOOLEAN) {
ar.add(cell.getBooleanCellValue());
} else if (type == HSSFCell.CELL_TYPE_FORMULA) {
// Re-run based on the formula type
handleCell(cell.getCachedFormulaResultType(), cell);
} else {
ar.add("");
}
}
public void handleSheet(Sheet sheet) {
for (Row row : sheet) {
for (Cell cell : row) {
handleCell(cell.getCellType(), cell);
}
}
}
请注意,迭代器仅提供文件中定义的单元格,因此如果从未使用过单元格,则会出现间隙。如果您需要让每个单元格包括丢失的单元格,请参阅Iterating vs Fetching docs
另一答案
使用Cell.getCachedFormulaResultType
,我们得到缓存的公式值;因此,我们必须评估公式以获得新值
public static void main(String args[]) {
FileInputStream inp = null;
try {
inp = new FileInputStream("E:\Hasangi\tets\test\book.xls");
HSSFWorkbook workbook = new HSSFWorkbook(inp);
FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator();
HSSFSheet sheet = workbook.getSheetAt(0);
Row row = sheet.getRow(2);
Cell cell = row.getCell(0);
cell.setCellValue(1235487845);
handleSheet(sheet, evaluator);
FileOutputStream fileOut = new FileOutputStream("E:\Hasangi\tets\test\book.xls");
workbook.write(fileOut);
fileOut.close();
} catch (IOException ex) {
Logger.getLogger(xlreader.class.getName()).log(Level.SEVERE, null, ex);
}
}
private static void handleCell(int type, Cell cell, FormulaEvaluator evaluator) {
if (type == HSSFCell.CELL_TYPE_STRING) {
System.out.println(cell.getStringCellValue());
} else if (type == HSSFCell.CELL_TYPE_NUMERIC) {
System.out.println(cell.getNumericCellValue());
} else if (type == HSSFCell.CELL_TYPE_BOOLEAN) {
System.out.println(cell.getBooleanCellValue());
} else if (type == HSSFCell.CELL_TYPE_FORMULA) {
// Re-run based on the formula type
evaluator.evaluateFormulaCell(cell);
handleCell(cell.getCachedFormulaResultType(), cell, evaluator);
} else {
System.out.println("");
}
}
public static void handleSheet(Sheet sheet,FormulaEvaluator evaluator) {
for (Row row : sheet) {
for (Cell cell : row) {
handleCell(cell.getCellType(), cell,evaluator);
}
}
}
另一答案
这是我的功能:
public void getValueOfFormulaCell() throws IOException
{
FileInputStream xlsfile = new FileInputStream(new File("D:\Desktop\Temp\marks.xls"));
HSSFWorkbook objWorkbook = new HSSFWorkbook(xlsfile);
Sheet sheet = objWorkbook.getSheetAt(0);
FormulaEvaluator evaluator = objWorkbook.getCreationHelper().createFormulaEvaluator();
// suppose your formula is in B4
CellReference cellReference = new CellReference("B4");
Row row = sheet.getRow(cellReference.getRow());
Cell cell = row.getCell(cellReference.getCol());
CellValue cellValue = evaluator.evaluate(cell);
switch (cellValue.getCellType()) {
case Cell.CELL_TYPE_BOOLEAN:
System.out.println(cellValue.getBooleanValue());
break;
case Cell.CELL_TYPE_NUMERIC:
System.out.println(cellValue.getNumberValue());
break;
case Cell.CELL_TYPE_STRING:
System.out.println(cellValue.getStringValue());
break;
case Cell.CELL_TYPE_BLANK:
break;
case Cell.CELL_TYPE_ERROR:
break;
// CELL_TYPE_FORMULA will never happen
case Cell.CELL_TYPE_FORMULA:
break;
}
}
以上是关于如何使用apache poi从公式单元格中读取单元格值的主要内容,如果未能解决你的问题,请参考以下文章
如何使用apache poi 3.1获取公式单元格值(数据)
JAVA中如何取得EXCEL中确定已知的单元格所包含的列数 急急急!!!