Java 以字符串形式从excel单元格中读取日期值

Java 以字符串形式从excel单元格中读取日期值,java,apache-poi,Java,Apache Poi,我正在使用ApachePOI库读取excel文件。我在读密码手机时卡住了。如果用户在密码单元格中以密码形式给出日期,即2012年5月16日。我将该值解读为“41045”,而该值应为“16/05/2012”。这是我的代码: cell = row.getCell(); // date in the cell password '16/05/2012' switch (cell.getCellType()) { case HSSFCell.CELL_TYPE_STRING: cellValu

我正在使用ApachePOI库读取excel文件。我在读密码手机时卡住了。如果用户在密码单元格中以密码形式给出日期,即2012年5月16日。我将该值解读为“41045”,而该值应为“16/05/2012”。这是我的代码:

cell = row.getCell(); // date in the cell password '16/05/2012'
switch (cell.getCellType()) {

case HSSFCell.CELL_TYPE_STRING:
    cellValue = cell.getRichStringCellValue().getString();
    break;
case HSSFCell.CELL_TYPE_NUMERIC:
    if(cellCount == TEMPLATE_PASSWORD) {// if cell is password
        cell.setCellType(Cell.CELL_TYPE_STRING);
        cellValue = cell.getRichStringCellValue().getString(); // value read is 41045 and not "16/05/2012"
    }
    break;
default:
}
有人能帮忙吗


谢谢。

在单元格值前加上“前缀”,然后将其保存到xls中,从而将其转换为字符串单元格。因此,从该单元格中读取的任何内容都将被视为字符串并按原样读取。

您在POI中查找的类是

Excel写入文件时,某些单元格存储为文字字符串,而其他单元格存储为数字(包括日期)。对于后者,表示单元格的浮点值存储在文件中,因此当您向POI请求单元格的值时,它实际具有的值

但有时,尤其是在进行文本提取时(但并非总是),您希望使单元格值看起来像Excel中的值。并非总是可以在字符串中精确地获取该值(例如,非完全空间填充),但DataFormatter类将使您接近该值


还要注意的是,在Excel中,日期自1900年起存储为浮点数,这就是为什么您看到的是数字而不是日期。使用DataFormatter(或类似工具)将其呈现为日期

使用以下代码获取excel工作表中输入的确切日期格式

DataFormatter df = new DataFormatter();
stringCellValue = df.formatCellValue(cell);

看看这个线程,它与您的问题几乎相同@在你的链接上,没有符合我要求的解决方案。我认为你收到的是数字而不是字符串,因为单元格的类型是数字。您确定密码单元格的数字类型正确吗?此解决方案要求输入数据的用户知道并记住这一点。为了程序(他们可能根本不知道)。好吧,我检查了DataFormatter,我将格式化日期字符串,即“41045”到“16/05/2012”。但若用户输入字符串为“05/16/2012”该怎么办?这里我将使用相同的日期字符串“41045”,但根据逻辑,它将转换为“16/05/2012”,而不是“05/16/2012”。或者我如何知道用户输入的是什么格式?当用户在单元格中输入值时,会对其应用一种格式(自动或显式),这就是用于渲染它的格式。DataFormatter将简单地根据任何格式呈现单元格。您好@NandkumarTekale,请告诉我您是如何将“41045”转换为“05/16/2012”。@ederrafo 1900年1月1日或1904年1月1日至今,具体取决于工作簿设置。只要向ApachePOI询问单元格的日期值,就可以为您完成转换,这就是我所说的实际答案。谢谢