Получить значение ячейки из листа Excel с Apache Poi - PullRequest
13 голосов
/ 07 апреля 2011

Как получить значение ячейки с помощью POI в Java?

Мой код выглядит так

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 + ")");

Но если есть в этом случае, как я могу проверить, что значение в моей ячейке содержит значение ошибки, например # DIV / 0! и как я могу заменить его на N / A

Ответы [ 2 ]

34 голосов
/ 07 апреля 2011

Вы должны использовать FormulaEvaluator, как показано здесь . Это вернет значение, которое является либо значением, присутствующим в ячейке, либо результатом формулы, если ячейка содержит такую ​​формулу:

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;
    }
}

если вам нужен точный константа (т. Е. Формула, если ячейка содержит формулу), тогда это показано здесь .

Редактировать: Добавил несколько примеров, чтобы помочь вам.

сначала вы получите ячейку (просто пример)

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

Если вы просто хотите установить значение в ячейку по формуле (не зная результата):

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

если вы хотите изменить сообщение, если в ячейке есть ошибка, вам нужно изменить формулу, например,

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

(эта формула проверяет, возвращает ли оценка ошибку, а затем отображает строку «N / A», или оценку, если это не ошибка).

если вы хотите получить значение, соответствующее формуле, тогда вам нужно использовать оценщик.

Надеюсь, эта помощь,
Гийом

9 голосов
/ 07 апреля 2011

Может быть по: -

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

        }
    }       

Для определенного типа клеток вы можете попробовать:

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;

}
...