gpt4 book ai didi

apache-poi - apache poi 从 excel date() 函数读取日期给出了错误的日期

转载 作者:行者123 更新时间:2023-12-04 04:37:57 24 4
gpt4 key购买 nike

我正在使用包含 DATE(year, month, day) 的 xlsx 文件单元格内的公式。此单元格的格式为日期,因此 Excel/OpenOffice 会显示正确的日期。
例如单元格内容是 '=DATE(2013;1;1)'产生:'01.01.2013'到目前为止 - 太好了。

使用 poi 库读取此文件时,我会这样做:

XSSFWorkbook workbook = new XSSFWorkbook(new FileInputStream(new File("/home/detlef/temp/test.xlsx")));
XSSFSheet sheet = workbook.getSheet("Sheet A");
XSSFCell cell = sheet.getRow(0).getCell(0);
System.out.println(cell.getDateCellValue());

这将打印出:
Sun Dec 31 00:00:00 CET 1899

我正在使用 POI 3.9。

谁能告诉我为什么会这样?

找到了一种方法:
if (cell.getCellType() == Cell.CELL_TYPE_FORMULA) {
FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator();
CellValue evaluate = evaluator.evaluate(cell);
Date date = DateUtil.getJavaDate(evaluate.getNumberValue());
System.out.println(date);
}

这产生:
Tue Jan 01 00:00:00 CET 2013

还是谢谢。

最佳答案

你所描述的一切都是完全正确和预期的

当 Excel 在单元格中存储公式时,它不仅存储公式本身(.xlsx 中的字符串,或 .xls 的解析标记形式),它还存储该公式的最后评估答案。这意味着当 Excel 加载时,它不必花费很长时间计算要显示的公式结果,它可以像任何其他单元格一样使用最后一个值呈现它们。

这就是为什么当您使用 Apache POI 更改 Excel 文件时,您需要运行评估以更新所有这些缓存的公式值,以便在您转到该单元格之前在 Excel 中看起来正确

但是,Excel 中有一些特殊的公式函数,它们被定义为 volatile。这些函数每次总是返回不同的值,例如 DATE ,对于这些 Excel 只是向单元格写入一个虚拟值(例如 0 或 -1),并在加载时重新评估它

当您读取 POI 中公式单元格的数值时,它会返回缓存的值。如果您希望 POI 评估公式,则需要像您这样做时要求它

Excel 中的日期存储为自 1/1/1900 或 1/1/1904(取决于标志)以来的小数天数。 -1 的值是 1899 年 12 月 31 日,因此这就是 Excel 写入 -1 并将其请求为日期时所看到的

关于apache-poi - apache poi 从 excel date() 函数读取日期给出了错误的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19412346/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com