Java Apache POI的getCachedFormulaResultType()返回不正确的类型

Java Apache POI的getCachedFormulaResultType()返回不正确的类型,java,excel,apache-poi,Java,Excel,Apache Poi,我正在看一张Excel表格。最初(在rowid 30之前),我得到的是公式单元格的正确(单元格类型\字符串)结果类型,但从第id 31行开始,我收到的结果类型不正确(单元格类型\数值) 请参阅下面的日志:我使用了==作为分隔符来分隔每一行的日志。第1列是焦点,其中对于rowID=30,我获取类型=String,而对于rowID=31,我获取类型=Numeric,但每行的第1列是String类型,因此我缺少如何获取字符串值 请查看日志对应行的Excel工作表内容 switch (c

我正在看一张Excel表格。最初(在rowid 30之前),我得到的是公式单元格的正确(单元格类型\字符串)结果类型,但从第id 31行开始,我收到的结果类型不正确(单元格类型\数值)

请参阅下面的日志:我使用了
==
作为分隔符来分隔每一行的日志。第1列是焦点,其中对于rowID=30,我获取类型=String,而对于rowID=31,我获取类型=Numeric,但每行的第1列是String类型,因此我缺少如何获取字符串值

请查看日志对应行的Excel工作表内容

        switch (cell.getCellType()) {

        case Cell.CELL_TYPE_FORMULA:
            cellWrapper.setCellValueFarmula(true);
            switch (cell.getCachedFormulaResultType()) {
            case Cell.CELL_TYPE_NUMERIC:
                cellValue = String.valueOf(cell.getNumericCellValue());
                logged.append("CELL_TYPE_FORMULA->CELL_TYPE_NUMERIC");
                break;
            case Cell.CELL_TYPE_STRING:
                cellValue = "" + cell.getRichStringCellValue();
                logged.append("CELL_TYPE_FORMULA->CELL_TYPE_STRING");
                break;
            case Cell.CELL_TYPE_BOOLEAN:
                cellValue = "" + cell.getBooleanCellValue();
                logged.append("CELL_TYPE_FORMULA->CELL_TYPE_BOOLEAN");
                break;
            case Cell.CELL_TYPE_ERROR:
                cellValue = "error! ";
                logged.append("CELL_TYPE_FORMULA->CELL_TYPE_ERROR");
                break;

            default:
                cellValue = null;
                logged.append("case not captured" + " type fetched = " + cell.getCellType());
                break;
            }
            break;
        case Cell.CELL_TYPE_BLANK:
            logged.append("CELL_TYPE_BLANK");
            cellValue = null;
            break;
        case Cell.CELL_TYPE_ERROR:
            cellValue = "error!";
            logged.append("CELL_TYPE_ERROR");
            break;
... some for cases below
Excel内容

   Col1                                                    Col2                                   Col3                 Col4
[ACTIVE] - 21 - 1A - CALDRA - 305     .  {Chitra Subramaniam - 9538924280}, {deepakag@yahoo.com}    12               Rs. 1,000
[ACTIVE] - 22 - 1A - CALDRA - 306     .  {Parasad Parigi - 9538924280}, {deepakag@yahoo.com}        25               Rs. 1,000
[SEALED] - 23 - 1A - CALDRA - 401     .  {Vivek - 9538924280}, {deepakag@yahoo.com}                 <empty cell>     Rs. 1,075
那么,如何检索单元格结果值,即使该值是数字?
是否有一种通用方法可以以字符串形式给出结果值,而不管单元格的类型是什么?

Excel中的单元格可以有多种不同的类型。POI将返回Excel存储的单元格值,Excel可能不会以这种方式显示它。(这样Excel可能有点神秘!)

如果希望POI尝试将单元格的格式设置为Excel中的格式,无论类型如何,那么您要查找的类是。您的代码类似于:

 DataFormatter fmt = new DataFormatter();
 for (Row r : sheet) {
    for (Cell c : r) {
       CellReference cr = new CellRefence(c);
       System.out.println("Cell " + cr.formatAsString() + " is " + 
                          fmt.formatCellValue(c) );
    }
 }

Excel中的单元格可以有多种不同的类型。POI将返回Excel存储的单元格值,Excel可能不会以这种方式显示它。(这样Excel可能有点神秘!)

如果希望POI尝试将单元格的格式设置为Excel中的格式,无论类型如何,那么您要查找的类是。您的代码类似于:

 DataFormatter fmt = new DataFormatter();
 for (Row r : sheet) {
    for (Cell c : r) {
       CellReference cr = new CellRefence(c);
       System.out.println("Cell " + cr.formatAsString() + " is " + 
                          fmt.formatCellValue(c) );
    }
 }

Excel中的单元格可以有多种不同的类型。POI将返回Excel存储的单元格值,Excel可能不会以这种方式显示它。(这样Excel可能有点神秘!)

如果希望POI尝试将单元格的格式设置为Excel中的格式,无论类型如何,那么您要查找的类是。您的代码类似于:

 DataFormatter fmt = new DataFormatter();
 for (Row r : sheet) {
    for (Cell c : r) {
       CellReference cr = new CellRefence(c);
       System.out.println("Cell " + cr.formatAsString() + " is " + 
                          fmt.formatCellValue(c) );
    }
 }

Excel中的单元格可以有多种不同的类型。POI将返回Excel存储的单元格值,Excel可能不会以这种方式显示它。(这样Excel可能有点神秘!)

如果希望POI尝试将单元格的格式设置为Excel中的格式,无论类型如何,那么您要查找的类是。您的代码类似于:

 DataFormatter fmt = new DataFormatter();
 for (Row r : sheet) {
    for (Cell c : r) {
       CellReference cr = new CellRefence(c);
       System.out.println("Cell " + cr.formatAsString() + " is " + 
                          fmt.formatCellValue(c) );
    }
 }


你试过数据格式化程序吗?这是将数字+格式规则转换为string@Gagravarr不,我没有尝试DataFormatter。如何使用数据格式化程序。你能再详细解释一下吗?你试过DataFormatter吗?这是将数字+格式规则转换为string@Gagravarr不,我没有尝试DataFormatter。如何使用数据格式化程序。你能再详细解释一下吗?你试过DataFormatter吗?这是将数字+格式规则转换为string@Gagravarr不,我没有尝试DataFormatter。如何使用数据格式化程序。你能再详细解释一下吗?你试过DataFormatter吗?这是将数字+格式规则转换为string@Gagravarr不,我没有尝试DataFormatter。如何使用数据格式化程序。请您再详细解释一下。POI中是否有任何规定允许开发人员只在单元格中输入字符串值,POI会自动将其转换为单元格的适当格式。尽管我通过在excel工作表中显式选择列并将其类型设置为文本来解决了此问题(前面是指向数值的),但我也会尝试这种方法。如果您有字符串,请给POI字符串。如果您有数字,请给POI数字+可选的格式规则。如果我在字符串变量中存储了一个数值,这正是Excel为您做的。例如
String a=“12”;
,然后POI可以在内部将其转换为数字格式,或者我必须先将其转换为数字格式并将其传递给POI。您需要自己进行转换,而且这样您才能完全控制POI中是否有任何规定允许开发人员只在单元格中输入字符串值,POI会自动将其转换为适当的格式虽然我通过在excel工作表中显式选择列并将其类型设置为text(之前指向数值)解决了这个问题,但我也会尝试这种方法。如果您有字符串,请给POI字符串。如果您有数字,请给POI数字+可选的格式规则。如果我在字符串变量中存储了一个数值,这正是Excel为您所做的。例如
String a=“12”;
,然后POI可以在内部将其转换为数字格式,或者我必须先将其转换为数字格式并将其传递给POI。您需要自己进行转换,而且这样您才能完全控制POI中是否有任何规定允许开发人员只在单元格中输入字符串值,POI会自动将其转换为适当的格式虽然我通过在excel工作表中显式选择列并将其类型设置为text(之前指向数值)解决了这个问题,但我也会尝试这种方法。如果您有字符串,请给POI字符串。如果您有数字,请给POI数字+可选的格式规则。如果我在字符串变量中存储了一个数值,这正是Excel为您所做的。例如
String a=“12”;
,然后POI可以在内部将其转换为数字格式,或者我必须先将其转换为数字格式并将其传递给POI。您需要自己进行转换,而且这样您才能完全控制POI中是否有任何规定允许开发人员只在单元格中输入字符串值,POI会自动将其转换为适当的格式虽然我通过在excel工作表中显式选择列并将其类型设置为text(之前指向数值)解决了这个问题,但我也将尝试这种方法。如果