xssf如何获取任何字符串

时间:2014-02-03 21:45:21

标签: java excel apache-poi xssf

我尝试使用apache poi xssf将excel文件解析为XML。 现在有一个单元格而不知道其中的内容我只想从中获取一个String。 但是当我使用

cell.getStringCellValue()

它引发了一个异常,因为它是以这种方式记录的,所以并不令人惊讶。 所以我通过检查天气来建立我的方式它是一个数字或文本单元格。但是如何处理配方细胞。它们可能包含

之类的数字
= A2 + B2

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

= C2

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

我如何才能知道我的单元格中的内容以及如何从中获取字符串?

4 个答案:

答案 0 :(得分:17)

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中应用的规则,并在最后为您提供格式良好的字符串。

答案 1 :(得分: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);

答案 2 :(得分:0)

您可以添加检查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;
            }

答案 3 :(得分: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;