getDateCellValue
报错可能由多种原因引起,以下是一些常见的情况及解决方法:
常见错误原因及解决方法
单元格类型不匹配:

原因:如果单元格不是日期类型,调用getDateCellValue
会报错,单元格是字符串、数字、布尔值等非日期类型时,直接调用该方法就会出错。
解决方法:在调用getDateCellValue
之前,先检查单元格的类型是否为日期类型,可以使用cell.getCellType() == CellType.NUMERIC
来判断,并且结合DateUtil.isCellDateFormatted(cell)
进一步确认是否是日期格式的数字单元格。
单元格格式问题:
原因:即使单元格显示为日期格式,但如果其实际格式与预期不符,也可能导致getDateCellValue
报错或获取到错误的日期值,单元格的日期格式可能是文本格式的日期字符串,或者是自定义的特殊格式。
解决方法:确保单元格的格式是正确的日期格式,可以通过设置单元格的格式代码来实现,如在 Excel 中选中单元格,右键选择 “设置单元格格式”,在 “数字” 选项卡中选择 “日期”,并选择合适的日期格式,如果是使用 POI 库创建或修改 Excel 文件,也可以使用相应的方法来设置单元格的格式,如cell.setCellStyle(style)
,其中style
是通过Workbook.createCellStyle()
和Style.setDataFormat(short format)
等方法创建和设置格式后的样式对象。
Excel 文件损坏或兼容性问题:

原因:Excel 文件本身存在损坏或与其他软件的兼容性存在问题,可能会导致读取日期单元格时出现错误。
解决方法:尝试使用其他版本的 Excel 软件打开文件,检查是否存在问题,如果文件是从其他来源获取的,确保其来源可靠且未被篡改,对于一些较旧版本的 Excel 文件,可能需要使用兼容模式打开或使用专门的工具进行转换。
POI 版本问题:
原因:不同版本的 POI 库对 Excel 文件的支持程度可能会有所不同,某些版本可能存在特定的 bug 或不支持某些功能,导致getDateCellValue
报错。
解决方法:升级或降级 POI 库的版本,以找到与当前 Excel 文件兼容的版本,可以在项目的构建文件中修改 POI 库的依赖版本号,然后重新构建项目。
示例代码
以下是使用 POI 库读取 Excel 日期单元格的正确示例代码:

- import org.apache.poi.ss.usermodel.*;
- import org.apache.poi.xssf.usermodel.XSSFWorkbook;
- import java.io.FileInputStream;
- import java.io.IOException;
- import java.text.SimpleDateFormat;
- import java.util.Date;
- public class ExcelReader {
- public static void main(String[] args) {
- String filePath = "path/to/excel/file.xlsx";
- try (FileInputStream fis = new FileInputStream(filePath);
- Workbook workbook = new XSSFWorkbook(fis)) {
- Sheet sheet = workbook.getSheetAt(0);
- Row row = sheet.getRow(0);
- Cell cell = row.getCell(0);
- if (cell != null && cell.getCellType() == CellType.NUMERIC && DateUtil.isCellDateFormatted(cell)) {
- Date date = cell.getDateCellValue();
- SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
- System.out.println("Date: " + sdf.format(date));
- } else {
- System.out.println("The cell is not a date type or the date format is incorrect.");
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
在上述代码中,首先通过FileInputStream
打开 Excel 文件,并创建一个Workbook
对象,然后获取指定的工作表和单元格,在调用getDateCellValue
之前,先检查单元格的类型是否为数字类型且是否为日期格式,只有满足条件时才获取日期值并进行格式化输出。