1

我已经使用Java POI有一段时间了,但是遇到了一个新问题,我想知道是否有人找到了解决方案。

阅读电子表格时,您需要知道单元格的类型才能使用正确的阅读方法。

所以你得到单元格类型,然后调用适当的读取方法来获取单元格的内容。

这适用于除 FORMULA 单元格之外的所有单元格,其中值是数字。如果是文本,您可以阅读它。但是如果结果值是一个数字,那么你从单元格中得到的只是一个空白字符串。

我已经阅读了 POI 的 javadocs,并且正在使用正确的数据类型(HSSFRichTextString),但仍然没有乐趣。

有人有解决方案吗?

PS POI 的这种行为确实让我感到困惑,因为应该有一个默认的 cell.toString() 方法,该方法将返回任何单元格类型的字符串表示,例如默认为单元格的 value 属性。(有点像可以选择“值”的特殊粘贴)。

PPS:正如所问 - 我正在使用 Java 6 (1.6.0_06) 和 poi-3.0.2-FINAL-20080204.jar

4

4 回答 4

3
 FileInputStream fis = new FileInputStream("c:/temp/test.xls");
    Workbook wb = new HSSFWorkbook(fis); //or new XSSFWorkbook("c:/temp/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()); 

    CellValue cellValue = evaluator.evaluate(cell);

    switch (cellValue.getCellType()) {
        case Cell.CELL_TYPE_BOOLEAN:
            System.out.println(cellValue.getBooleanValue());
            break;
        case Cell.CELL_TYPE_NUMERIC:
            System.out.println(cellValue.getNumberValue());
            break;
        case Cell.CELL_TYPE_STRING:
            System.out.println(cellValue.getStringValue());
            break;
        case Cell.CELL_TYPE_BLANK:
            break;
        case Cell.CELL_TYPE_ERROR:
            break;

        // CELL_TYPE_FORMULA will never happen
        case Cell.CELL_TYPE_FORMULA: 
            break;
    }

从这里无耻地复制

于 2009-02-09T05:03:13.933 回答
2

只需将该单元格转换为文本..使用复制-“特殊粘贴”...我按如下方式进行...

从第 2 点阅读:

http://www.asif-shahzad.com/2010/12/how-to-read-numbers-as-string-value-in.html

于 2010-12-12T18:34:14.887 回答
1

使用 createFormulaEvaluator 的替代方法是使用 SetCellType(CellType.STRING),然后访问 StringCellValue。当它包含 WORKDAY() 函数时,我在使用公式评估器(使用 NPOI)时遇到了问题。

于 2012-08-13T16:44:15.617 回答
1

如果 POI 不适合您,请尝试Andy Khan 的 JExcel。我更喜欢它。

于 2009-02-09T10:57:58.650 回答