如何将任何内容作为字符串获取 - XSSF

11

我尝试使用Apache POI XSSF将Excel文件解析为XML。现在有一个单元格,不知道里面是什么,我只想从中获取一个字符串。但是当我使用以下代码:

cell.getStringCellValue()

它抛出了一个异常,这并不奇怪,因为文档是这样描述的。所以我通过检查单元格是数字或文本来解决这个问题。但是对于公式单元格该怎么办呢?它们可能包含像

= A2 + B2

什么使我得到总和(例如4)或另一篇文章的参考

= C2

如何描述像“Hans”这样的文本。

我该如何知道我的单元格中实际包含什么内容,并如何将其转换为字符串?

4个回答

27

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中应用的规则对其进行格式化,并在最后将一个漂亮格式化的字符串返回给您。


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);

它适用于参考单元格吗?比如第一个单元格有另一个工作表的第一个单元格的引用。 - sameer joshi

1
您可以按以下方式对单元格类型进行检查:
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;
            }

1
我已经做过了。但是当CELL类型为CELL_TYPE_FORMULA时该怎么办?我怎么知道要使用哪个getter? - mxcd

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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接