Apache POI-HSSF:获取十进制而不是文本字符串

时间:2011-06-03 20:17:44

标签: apache text decimal apache-poi poi-hssf

我使用Apache POI-HSSF处理Excel文件。

我的电子表格中有一个看起来像“115”的单元格。我确认它被格式化为“文本”(格式化单元格 - >文本)。

然而,当我把它读作时     row.getCell(0)的ToString()

我收到这个字符串:“115.0”

这是不正确的。我应该得到“115”,因为它明确地格式化为文本。我怎样才能得到理想的结果?单元格可以是任何东西,数字或字符,我期望与单元格中的字符串相同。感谢

2 个答案:

答案 0 :(得分:2)

格式化为文本并不意味着存储为文本,它们是不同的。 Excel已将您的单元格存储为数字,当您向POI询问单元格时,您将获得一个数字单元格。

如果您询问单元格的类型,您会发现它的类型为CELL_TYPE_NUMERIC而不是CELL_TYPE_STRING

您可能想要做的是使用DataFormatter class按照Excel格式化您的单元格。它看起来就像你期待的那样。 (也将格式化为货币,百分比等的单元格)

答案 1 :(得分:1)

您应该调用HSSFCell.getCellType()方法来确定其类型。这是一个处理String或Numeric类型的单元格的方法。 (您可以轻松添加其他类型。)用于数字的格式将是有效格式,但不一定与SpreadSheet的格式匹配。 (这将在下面介绍。)

public static String getCellStringValue(final HSSFCell cell) {
    int cellType = cell.getCellType();
    String value;
    if (cellType == HSSFCell.CELL_TYPE_NUMERIC) {
        // Locale is optional here
        DataFormatter dataFormatter = new DataFormatter(Locale.US);
        value = dataFormatter.formatCellValue(cell);
    } else {
        // HSSFCell.CELL_TYPE_STRING
        value = cell.getStringCellValue();
    } // more cell types are possible. Add whatever you need.
    return value;
}

该代码不一定会格式化Excel中显示的数字。 如果您需要格式与电子表格格式完全匹配,则可以从单元格本身获取格式化程序。为此,您可以使用DataFormatter实例创建Format实例:

public static String getCellStringValue(final HSSFCell cell) {
    int cellType = cell.getCellType();
    String value;
    if (cellType == HSSFCell.CELL_TYPE_NUMERIC) {
        // Locale is optional here
        DataFormatter dataFormatter = new DataFormatter(Locale.US);
        Format format = dataFormatter.createFormat(cell);
        value = format.format(cell.getNumericCellValue());
    } else {
        // HSSFCell.CELL_TYPE_STRING
        value = cell.getStringCellValue();
    } // more cell types are possible. Add whatever you need.
    return value;
}