我在单元格中使用xlsx时有这个日期:03-09-2014
当我使用apache POI读取xlsx单元格时,它写道:41883.0
。
这就是我这样做的方式:
while (cellIterator.hasNext()) {
Cell cell = cellIterator.next();
cell.setCellType(Cell.CELL_TYPE_STRING);
System.out.print(cell.getStringCellValue() + ";");
}
由于我已将所有单元格转换为String类型,因此我预计日期不会变形......
任何解决方案? apache poi DataFormatter on cell containing date 这是解决方案:)
答案 0 :(得分:4)
为什么呢?为什么哦为什么哦为什么你要编写代码开始?它在这么多级别上都是错误的,正如Stackoverflow上可能每三个Apache POI问题所涵盖的那样:(哦,它的explicitly advised against in the JavaDocs ......
您有两种选择。如果您想完全控制读取值,请按照instructions in the Apache POI documentation on reading cell values,编写如下代码:
for (Row row : sheet1) {
for (Cell cell : row) {
CellReference cellRef = new CellReference(row.getRowNum(), cell.getColumnIndex());
System.out.print(cellRef.formatAsString());
System.out.print(" - ");
switch (cell.getCellType()) {
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;
case Cell.CELL_TYPE_BOOLEAN:
System.out.println(cell.getBooleanCellValue());
break;
case Cell.CELL_TYPE_FORMULA:
System.out.println(cell.getCellFormula());
break;
default:
System.out.println();
}
}
}
或者,如果您只是想要#34;给我最接近的字符串,您可以在Excel"中找到此单元格的样子,那么您需要使用DataFormatter class,它提供了读取Excel格式规则应用于单元格,然后重新创建(尽可能)Java中的那些
您的代码应为:
DataFormatter fmt = new DataFormatter();
String valueAsInExcel = fmt.formatCellValue(cell);
这将根据Excel中应用的格式规则格式化数字,因此应按预期返回
最后,excel中的日期自1900年或1904年起存储为浮点数,这就是您在日期单元格中看到的数字。