3

そのような問題で私を助けてくれませんか。

各セルを文字列値として読み取る必要があります。この場合、apache poi lib を使用しています。および各セルを正規化するためのそのような方法:

String getNormilizedCell(Cell cell){
return new DataFormatter().formatCellValue(cell);}

しかし、.xlsxファイルで私はそのような値に直面したとき:

|#N/A|#N/A|...|...|...

エラー[Unexpected Cell type (5)]が発生しましたが、これを処理する方法がわかりません。Google で必要な情報が見つかりません。

4

4 に答える 4

5

このDataFormatterクラスは、、、、、および のみCELL_TYPE_FORMULAを処理CELL_TYPE_NUMERICします。を処理しません。CELL_TYPE_STRINGCELL_TYPE_BOOLEANCELL_TYPE_BLANKCELL_TYPE_ERROR5

これを回避するには、まずエラー セル タイプを検出してから、エラー セル値コードを参照して特別に処理する必要があります。

if (cell.getCellType() == Cell.CELL_TYPE_ERROR) {
    byte errorValue = cell.getErrorCellValue();
    switch(errorValue) {
    case ERROR_DIV_0:
        return "#DIV/0!";
    case ERROR_NA:
        return "#N/A";
    case ERROR_NAME:
        return "#NAME?";
    case ERROR_NULL:
        return "#NULL!";
    case ERROR_NUM:
        return "#NUM!";
    case ERROR_REF:
        return "#REF!";
    case ERROR_VALUE:
        return "#VALUE!";
    default:
        return "Unknown error value: " + errorValue + "!";
    }
} else {
    return new DataFormatter().formatCellValue(cell);
}
于 2013-10-31T16:26:56.547 に答える
2

Apache POI のコピーをアップグレードする必要があります!

r1537552の時点で、DataFormatterはエラー セルをフォーマットできるようになりました。FormulaError定数を使用して、Excelが表示するエラー文字列を返します

于 2013-10-31T16:55:50.953 に答える
1

@Gagravarr が言ったように、現在 DataFormatter はほとんどのエラーを処理します (私は poi-3.11-beta2 を使用しています)。しかし、私のコメントで述べたように、一部の数式エラーは依然として例外をスローする可能性があります。

たとえば、=xxx()xxx が実際の関数ではない場合のように数式を評価すると、Excel は表示されます#NAME?が、「名前 'xxx' を評価する方法がわからない」という実行時例外が発生します。

幸いなことに、処理は簡単です。

public String readCellValue(Cell cell)
{
    switch (cell.getCellType())
    {
    case Cell.CELL_TYPE_BLANK:
        return "(blank)";
    case Cell.CELL_TYPE_BOOLEAN:
        return String.valueOf(cell.getBooleanCellValue());
    case Cell.CELL_TYPE_ERROR:
        return String.valueOf(cell.getErrorCellValue());
    case Cell.CELL_TYPE_FORMULA:
        return readFormattedCellValue(cell);
    case Cell.CELL_TYPE_NUMERIC:
        return String.valueOf(cell.getNumericCellValue());
    case Cell.CELL_TYPE_STRING:
        return cell.getStringCellValue();
    default:
        return "Unknown type!";
    }
}

public String readFormattedCellValue(Cell cell)
{
    try
    {
        return formatter.formatCellValue(cell, evaluator);
    }
    catch (RuntimeException e)
    {
        return e.getMessage(); // Error from evaluator, for example "Don't know how to evaluate name 'xxx'" if we have =xxx() in cell
    }
}

レコードについては、formatterCSVevaluatorへの変換の例のように作成されます。

    try (FileInputStream fis = new FileInputStream(file))
    {
        // Open the workbook and then create the FormulaEvaluator and
        // DataFormatter instances that will be needed to, respectively,
        // force evaluation of formulae found in cells and create a
        // formatted String encapsulating the cells contents.
        workbook = WorkbookFactory.create(fis);
        evaluator = workbook.getCreationHelper().createFormulaEvaluator();
        formatter = new DataFormatter(true);
    }

なんらかの理由で、WorkbookFactoryは poi-3.11-beta2.jar ではなく、poi-ooml-3.11-beta2.jar にのみ存在します。

于 2014-09-30T09:20:28.963 に答える