简体   繁体   English

使用 Apache Poi 从 Excel 工作表中获取单元格值

[英]Get Cell Value from Excel Sheet with Apache Poi

How to get cell value with poi in java ?如何在java中使用poi获取单元格值?

My code is look like this我的代码看起来像这样

String cellformula_total__percentage= "(1-E" + (rowIndex + 2) + "/" + "D" + (rowIndex + 2) + ")*100";
cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
cell.setCellStyle(this.valueRightAlignStyleLightBlueBackground);
cell.setCellFormula("abs(" + cellformula_total__percentage + ")");

But if there is in this case how can i check that my cell value contain error value like #DIV/0!但是如果在这种情况下我如何检查我的单元格值是否包含错误值,如#DIV/0! and how can i replace it with N/A我如何用 N/A 替换它

You have to use the FormulaEvaluator, as shown here .您必须使用FormulaEvaluator,如图所示这里 This will return a value that is either the value present in the cell or the result of the formula if the cell contains such a formula :如果单元格包含这样的公式,这将返回一个值,该值要么是单元格中存在的值,要么是公式的结果:

FileInputStream fis = new FileInputStream("/somepath/test.xls");
Workbook wb = new HSSFWorkbook(fis); //or new XSSFWorkbook("/somepath/test.xls")
Sheet sheet = wb.getSheetAt(0);
FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator();

// suppose your formula is in B3
CellReference cellReference = new CellReference("B3"); 
Row row = sheet.getRow(cellReference.getRow());
Cell cell = row.getCell(cellReference.getCol()); 

if (cell!=null) {
    switch (evaluator.evaluateFormulaCell(cell)) {
        case Cell.CELL_TYPE_BOOLEAN:
            System.out.println(cell.getBooleanCellValue());
            break;
        case Cell.CELL_TYPE_NUMERIC:
            System.out.println(cell.getNumericCellValue());
            break;
        case Cell.CELL_TYPE_STRING:
            System.out.println(cell.getStringCellValue());
            break;
        case Cell.CELL_TYPE_BLANK:
            break;
        case Cell.CELL_TYPE_ERROR:
            System.out.println(cell.getErrorCellValue());
            break;

        // CELL_TYPE_FORMULA will never occur
        case Cell.CELL_TYPE_FORMULA: 
            break;
    }
}

if you need the exact contant (ie the formla if the cell contains a formula), then this is shownhere .如果您需要确切的内容(即,如果单元格包含公式,则为表格),则此处显示。

Edit : Added a few example to help you.编辑:添加了一些示例来帮助您。

first you get the cell (just an example)首先你得到细胞(只是一个例子)

Row row = sheet.getRow(rowIndex+2);    
Cell cell = row.getCell(1);   

If you just want to set the value into the cell using the formula (without knowing the result) :如果您只想使用公式将值设置到单元格中(不知道结果):

 String formula ="ABS((1-E"+(rowIndex + 2)+"/D"+(rowIndex + 2)+")*100)";    
 cell.setCellFormula(formula);    
 cell.setCellStyle(this.valueRightAlignStyleLightBlueBackground);

if you want to change the message if there is an error in the cell, you have to change the formula to do so, something like如果您想在单元格中有错误的情况下更改消息,则必须更改公式才能这样做,例如

IF(ISERR(ABS((1-E3/D3)*100));"N/A"; ABS((1-E3/D3)*100))

(this formula check if the evaluation return an error and then display the string "N/A", or the evaluation if this is not an error). (此公式检查评估是否返回错误,然后显示字符串“N/A”,如果这不是错误则显示评估)。

if you want to get the value corresponding to the formula, then you have to use the evaluator.如果你想得到公式对应的值,那么你必须使用求值器。

Hope this help,希望这有帮助,
Guillaume纪尧姆

May be by:-可能是:-

    for(Row row : sheet) {          
        for(Cell cell : row) {              
            System.out.print(cell.getStringCellValue());

        }
    }       

For specific type of cell you can try:对于特定类型的单元格,您可以尝试:

switch (cell.getCellType()) {
case Cell.CELL_TYPE_STRING:
    cellValue = cell.getStringCellValue();
    break;

case Cell.CELL_TYPE_FORMULA:
    cellValue = cell.getCellFormula();
    break;

case Cell.CELL_TYPE_NUMERIC:
    if (DateUtil.isCellDateFormatted(cell)) {
        cellValue = cell.getDateCellValue().toString();
    } else {
        cellValue = Double.toString(cell.getNumericCellValue());
    }
    break;

case Cell.CELL_TYPE_BLANK:
    cellValue = "";
    break;

case Cell.CELL_TYPE_BOOLEAN:
    cellValue = Boolean.toString(cell.getBooleanCellValue());
    break;

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM