3

你能帮我解决这样的问题吗?

我需要将每个单元格读取为字符串值。在这种情况下,我使用的是 appache poi lib。以及使每个单元格标准化的方法:

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

但是当我在 .xlsx 文件中遇到这样的值时:

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

我收到错误[Unexpected Cell type (5)],我不知道如何处理。在谷歌我找不到必要的信息。

4

4 回答 4

5

该类DataFormatter仅处理CELL_TYPE_FORMULACELL_TYPE_NUMERICCELL_TYPE_STRINGCELL_TYPE_BOOLEANCELL_TYPE_BLANK。它不处理CELL_TYPE_ERROR,即5

您必须通过首先检测错误单元格类型然后特别处理它来解决此问题,参考错误单元格值代码

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

作为记录,formatterevaluator像在转换为 CSV 示例中一样创建:

    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-ooml-3.11-beta2.jar 中,而不在 poi-3.11-beta2.jar 中。

于 2014-09-30T09:20:28.963 回答
0
I too faced the same error while working on Spring batch insert excel data to DB.

I was using spring-batch-excel version 0.5.0 and poi 3.12

<dependency>
        <groupId>org.springframework.batch</groupId>
        <artifactId>spring-batch-excel</artifactId>
        <version>0.5.0-SNAPSHOT</version>
    </dependency>

Once Updated to spring-batch-excel version 1.0.1 and poi 3.17, It was resolved.

    <dependency>
        <groupId>com.github.kumarpankaj18</groupId>
        <artifactId>spring-batch-excel</artifactId>
        <version>1.0.1</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>3.17</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>3.17</version>
     </dependency>

注意:即使 poi 5.0.0 也不起作用,我只能使用 3.17

于 2021-08-23T11:49:50.697 回答