【问题标题】:apache poi language version causes date format misinterpretationapache poi语言版本导致日期格式误解
【发布时间】:2013-08-26 07:59:16
【问题描述】:

编辑: 为避免混淆,这是我原来问题的(再次)改进版本:

问题 如何以 Microsoft Excel 显示单元格的方式读出单元格的字符串表示形式,而不知道各自对格式设置进行硬编码(但例如使用单元格自己的格式设置来格式化输出)。

回答这么远 如果您使用的是美国版的 excel,这将没有问题,对于所有其他版本,Apache POI 将返回与美国版 excel 的显示方式相同的字符串,并且 Apache POI 中没有内置方式可以更改这个。我可以确认“工作”的唯一方法是 - 正如 Gagravarr 建议的那样 - 将我的 Mac 上的语言切换为 US/EN。然后 Apache POI 和 Excel 将提供相同的结果。这是一种逆解。

问题是:在德文版的 excel 中,单元格显示为 01.12.13,但由于它被格式化为日期

HSSFCell cell = (HSSFCell) cellIter.next();
HSSFDataFormatter formatter=new HSSFDataFormatter();
String val=formatter.formatCellValue(cell)

给我一​​个21/01/13 的值。


原来的问题是:

我有一个 xlsx 文件,其中包含在 Excel 中显示的日期字段,例如

01.12.13使用单元格TT.MM.JJ的格式设置

如果我用 apache poi 读取相同的文件,获取单元格和格式 à la

HSSFCell cell = (HSSFCell) cellIter.next();
HSSFDataFormatter formatter=new HSSFDataFormatter();
String val=formatter.formatCellValue(cell)

(当然,cellIter 是一个有效的迭代器,简化示例)

我的val 原来是21/01/13。据我了解,HSFDataFormatter 的方法 formatCellValue() 应该返回一个使用单元格格式设置格式化的值的字符串。

有人知道如何让 val 包含与 Excel 中相同的格式吗?

感谢您的帮助!谢谢!

【问题讨论】:

  • 我很确定您的文件在格式字符串中实际上不会包含 Ts 和 Js,我怀疑这是“神奇”的 Excel 本地化功能。如果您在计算机上以美国语言环境,它在那里显示的方式与 POI 相同吗?
  • 耶!当我将我的 Mac 切换到英语时,您完全正确,Excel 中的格式与 Apache POI 中的格式相同!对于解决方法,我只需要知道如何读出单元格的格式设置。
  • Excel 有两种格式字符串,一种是“神奇地”本地化自己,另一种是在任何地方看起来都一样。我建议您将您的单元格明确地格式化为后者,首先是这样 POI 能够得到您想要的内容,其次是让您发送文件的其他人也能以您的方式查看它!
  • 问题是我的客户从他的客户那里得到了那些 excel 表格,而且他们不会正确地格式化他们的表格。对于大多数办公室来说,Excel 格式仍然是 Voodoo。戳它直到它看起来正确。一旦我找到了一个优雅的解决方案,我会在这里发布。谢谢大家的意见!

标签: java excel apache-poi


【解决方案1】:

您可以自定义日期格式如下:

HSSFCell cell = (HSSFCell) cellIter.next();
SimpleDateFormat DtFormat = new SimpleDateFormat("dd.MM.YY");
Date date=cell.getDateCellValue();
System.out.println(DtFormat.format(date).toString());

这会将值打印为 21.01.13。

【讨论】:

  • @MoritzWalter:如果它适合你。请接受答案。
  • 嘿!非常感谢作为解决方案一部分的提示。我必须处理一些格式混乱的 Excel 表格。因此,我不知道单元格中是否有有效的日期。如果我将工作表中的所有单元格评估为日期,仅仅因为 getCellType() 告诉我这是一个日期,我最终会解析错误。我所知道的是,如果客户在 excel 中打开工作表,日期将显示为 01.12.12(无论此单元格是否正确格式化为日期)。有没有办法获取单元格内容的 Excel 等效字符串?
  • 不确定但试试cell.toString();
  • 非常感谢,不幸的是在这种情况下cell.toString() 的行为与HSSFDataFormatter.formatCellValue(cell) 完全一样
  • 您是否知道如何从单元格中取出代表格式(例如"dd.MM.YY")的字符串? String formatString=cell.getFormat(); 之类的东西用于将其输入 SimpleDateFormat(formatString);
猜你喜欢
  • 2012-04-03
  • 1970-01-01
  • 2012-12-28
  • 1970-01-01
  • 1970-01-01
  • 2017-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多