web-dev-qa-db-ja.com

Apache Poiを使用してExcelシートからセル値を取得する

Java?のpoiでセル値を取得する方法

私のコードはこんな感じ

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に置き換えることができますか

14
Ravi Parmar

here のように、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;
    }
}

正確な定数が必要な場合(つまり、セルに数式が含まれる場合は形式)、これは here と表示されます。

Edit:役立つ例をいくつか追加しました。

最初にセルを取得します(ほんの一例)

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」を表示するか、これがエラーでない場合は評価を表示します)。

式に対応する値を取得する場合は、エバリュエーターを使用する必要があります。

この助けを願って、
ギヨーム

35
PATRY Guillaume

によって可能性があります:-

    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;

}
9
Harry Joy