11

我尝试使用 apache poi xssf 将 excel 文件解析为 XML。现在有了一个单元格,但不知道里面有什么,我只想从中取出一个字符串。但是当我使用

cell.getStringCellValue()

它抛出了一个异常,这并不令人惊讶,因为它是以这种方式记录的。所以我通过检查天气来解决这个问题,它是一个数字还是一个文本单元格。但是如何处理公式单元格。它们可能包含数字,例如

= A2 + B2

是什么给了我总和(例如 4)或对另一个文本的引用

= C2

什么可能指的是像“汉斯”这样的文字。

我怎样才能知道我的牢房里到底有什么,以及如何从中取出一个字符串?

4

4 回答 4

26

Excel 将一些单元格存储为字符串,但大多数存储为应用了特殊格式规则的数字。如果要获取原始值,请使用基于cell.getCellType()其他一些答案所示的 switch 语句。

但是,如果您想要的是单元格的字符串,显示与 Excel 显示的相同,基于对单元格 + 单元格类型应用所有格式规则,那么 Apache POI 有一个类可以做到这一点 - DataFormatter

您需要做的就是:

 Workbook wb = WorkbookFactory.create(new File("myfile.xls"));
 DataFormatter df = new DataFormatter();

 Sheet s = wb.getSheetAt(0);
 Row r1 = s.getRow(0);
 Cell cA1 = r1.getCell(0);

 String asItLooksInExcel = df.formatCellValue(cA1);

不管单元格类型是什么,DataFormatter 都会使用 Excel 中应用的规则为您尽可能地格式化它,并在最后为您返回一个格式良好的字符串。

于 2014-02-04T10:46:28.093 回答
2

接受的答案不适用于公式单元格(在结果字符串中你得到公式,而不是公式的结果)。以下是在每种情况下都对我有用的方法:

final XSSFWorkbook workbook = new XSSFWorkbook(file);
final DataFormatter dataFormatter = new DataFormatter();
final FormulaEvaluator objFormulaEvaluator = new XSSFFormulaEvaluator(workbook);
final Cell cell = ...;
objFormulaEvaluator.evaluate(cell);
final String cellValue = dataFormatter.formatCellValue(cell, objFormulaEvaluator);
于 2017-09-25T09:50:45.530 回答
1

您可以添加对 CELL 类型的检查,如下所示:

switch(cell.getCellType()) {
                case Cell.CELL_TYPE_BOOLEAN:
                    System.out.print(cell.getBooleanCellValue() + "\t\t");
                    break;
                case Cell.CELL_TYPE_NUMERIC:
                    System.out.print(cell.getNumericCellValue() + "\t\t");
                    break;
                case Cell.CELL_TYPE_STRING:
                    System.out.print(cell.getStringCellValue() + "\t\t");
                    break;
            }
于 2014-02-03T21:49:30.820 回答
0

试试这个

           case Cell.CELL_TYPE_FORMULA:
                    switch (cell.getCachedFormulaResultType()) {
                        case Cell.CELL_TYPE_STRING:
                            System.out.println(cell.getRichStringCellValue().getString());
                            break;
                        case Cell.CELL_TYPE_NUMERIC:
                            if (DateUtil.isCellDateFormatted(cell)) {
                                System.out.println(cell.getDateCellValue() + "");
                            } else {
                                System.out.println(cell.getNumericCellValue());
                            }
                            break;
                    }
                    break;
于 2014-02-04T09:56:13.880 回答