从Excel单元格中读取日期值作为字符串

10

我正在使用Apache POI库读取Excel文件。当我尝试读取密码单元格时遇到了问题。如果用户将日期作为密码输入,例如“16/05/2012”,我读取的值是“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:
}

有人可以帮忙吗?

谢谢。


看一下这个帖子,它几乎和你的问题一样。 https://dev59.com/GHA75IYBdhLWcg3ws7ci - user983652
@mashhur 在你提供的链接中,并没有符合我的需求的解决方案。 - Nandkumar Tekale
我认为你收到的是数字而不是字符串,因为单元格的类型是数值型的。你确定密码单元格使用数值型是正确的吗? - ImLearning
3个回答

19

您在POI中寻找的类是DataFormatter

当Excel写入文件时,一些单元格被存储为文字字符串,而其他单元格则被存储为数字(包括日期)。对于后者,在文件中存储表示单元格的浮点值,所以当您要求POI提供单元格的值时,实际上就是这个值。

有时候,特别是在文本提取时(但并非总是如此),您希望使单元格的值看起来像在Excel中一样。虽然不总是可能在字符串中完全匹配(例如,没有填充整个空间),但DataFormatter类可以让您接近。

还请注意,Excel中的日期自约1900年以来以浮点数形式存储,这就是为什么您看到一个数字而不是日期的原因。使用DataFormatter(或类似工具)将其呈现为日期。


我查看了DataFormatter,我将格式化日期字符串,例如“41045”转换为“16/05/2012”。但是如果用户输入的字符串是“05/16/2012”呢?这里我将有相同的日期字符串“41045”,但根据逻辑它将转换为“16/05/2012”而不是“05/16/2012”。或者我怎么知道用户输入的格式是什么? - Nandkumar Tekale
当用户输入一个值到单元格中时,会应用一个格式(自动或显式),这就是用来呈现它的。DataFormatter将根据该格式简单地呈现单元格。 - Gagravarr
你好@NandkumarTekale,请问您是如何将“41045”转换为“05/16/2012”的? - ederrafo
@ederrafo 这是距离1900年1月1日或1904年的天数,具体取决于工作簿设置。只需查询Apache POI单元格的日期值,即可为您执行转换。 - Gagravarr
这并没有回答问题,事实上,DataFormatter没有任何有用的功能。它是一个完全过时的类。你可以直接使用日期格式来处理。希望将日期作为字符串的原因是尽管工作簿设置不正确,仍能正确解析日期。 - Yannick Mussche

14

使用以下代码可以得到与在Excel表格中输入的确切日期格式相同的日期。

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

这就是我所说的实用回答。谢谢! - Noam Manos

5

将单元格值保存为xls时,以'为前缀将其呈现为字符串单元格。因此,无论从该单元格读取什么内容都将被视为字符串并按原样读取。


1
这个解决方案需要输入数据的用户知道并记住这一点,以便程序可以正常运行(他们甚至可能不知道这个程序存在)。 - Attila

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接