我尝试使用apache poi xssf将excel文件解析为XML。 现在有一个单元格而不知道其中的内容我只想从中获取一个String。 但是当我使用
时cell.getStringCellValue()
它引发了一个异常,因为它是以这种方式记录的,所以并不令人惊讶。 所以我通过检查天气来建立我的方式它是一个数字或文本单元格。但是如何处理配方细胞。它们可能包含
之类的数字= A2 + B2
是什么给了我总和(例如4)或对另一个文本的引用
= C2
可能指的是像“汉斯”这样的文字。
我如何才能知道我的单元格中的内容以及如何从中获取字符串?
答案 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;