Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java xssf如何获取字符串形式的任何内容_Java_Excel_Apache Poi_Xssf - Fatal编程技术网

Java xssf如何获取字符串形式的任何内容

Java xssf如何获取字符串形式的任何内容,java,excel,apache-poi,xssf,Java,Excel,Apache Poi,Xssf,我尝试使用ApachePOIXSSF将excel文件解析为XML。 现在有一个细胞,不知道里面是什么,我只想从中得到一个字符串。 但是当我使用 cell.getStringCellValue() 它抛出了一个异常,这并不奇怪,因为它是以这种方式记录的。 所以我通过检查它是数字还是文本单元格来构建我的方法。但是如何处理公式单元格呢。它们可能包含以下数字: = A2 + B2 是什么给了我总数(如4)或其他文本的参考 = C2 可能指的是像“Hans”这样的文本 我如何知道我的单元格中到底有什

我尝试使用ApachePOIXSSF将excel文件解析为XML。 现在有一个细胞,不知道里面是什么,我只想从中得到一个字符串。 但是当我使用

cell.getStringCellValue()
它抛出了一个异常,这并不奇怪,因为它是以这种方式记录的。 所以我通过检查它是数字还是文本单元格来构建我的方法。但是如何处理公式单元格呢。它们可能包含以下数字:

= A2 + B2
是什么给了我总数(如4)或其他文本的参考

= C2
可能指的是像“Hans”这样的文本


我如何知道我的单元格中到底有什么,以及如何从中提取字符串?

您可以按如下方式添加单元格类型检查:

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;
            }
试试这个

           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;

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

但是,如果您想要的是一个单元格字符串,根据对单元格+单元格类型应用的所有格式规则,它显示的内容与Excel显示的内容相同,那么Apache POI有一个类来实现这一点-

您需要做的就是:

 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中应用的规则,尽可能为您格式化单元格,并在最后返回一个格式良好的字符串。

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

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

我已经做到了。但是当单元格类型为CELL\u type\u公式时,该怎么办?我如何知道我必须使用哪种getter?它对参考单元格有效吗?与第一个单元格类似,第一个单元格引用了另一张图纸。。