2013-08-26 66 views
0

编辑: 为了避免混淆,这里是一个我原来的问题(再次)的改进版:的Apache POI语言版本会导致日期格式误解

问题 我如何读出一个细胞的String表示刚Microsoft Excel将显示它的方式,而不知道各自对格式设置进行硬编码(但例如使用单元格自己的格式设置来格式化输出)。

答案至今 这将是没有问题的,如果你正在使用Excel的美国版本,所有其它版本的Apache POI将返回字符串等同于Excel中的美版将如何显示它并没有在Apache POI中没有内置的方法来改变这一点。只有我可以确认的方式是,“working”是 - 正如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一个VAL。


原来的问题是:

我在使用电池TT.MM.JJ

的格式设置。如果我包含显示在Excel中像

01.12.13日期字段XLSX文件用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中相同的格式?

我感谢任何帮助!谢谢!

+0

我相当肯定你的文件实际上不会有TS和JS格式字符串,我怀疑这就是“神奇”的Excel本地化踢。如果你在美国语言环境中打开你的计算机上的文件,不是在那里显示POI的相同方式? – Gagravarr

+0

耶!当我将Mac切换到英文时,您完全正确,Excel中的格式与Apache POI中的格式相同!对于解决方法,我只是需要知道如何读出单元格的格式设置。 –

+0

Excel有两种格式字符串,那些“神奇地”将自己本地化的字符串,以及那些在任何地方都一样的字符串。我建议你把你的单元格格式化为后者,首先让POI能够得到你想要的内容,其次让你发送文件的其他人看到它的样子! – Gagravarr

回答

1

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

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

这将打印值作为13年1月21日。

+0

@MoritzWalter:如果它适合你。请接受答案。 – Sankumarsingh

+0

嘿!作为解决方案的一部分,提示非常感谢。我必须处理大量格式错误的Excel表格。因此,我不知道在单元格中是否有有效的日期。如果我将表格中的所有单元格评估为日期,只是因为getCellType()告诉我这是一个日期,我最终会解析错误。我所知道的是,如果客户端在Excel中打开表单,日期将显示为'01.12.12'(不管这个单元格是否被格式化为日期)。有没有获得单元格内容的Excel-Equivalent-String的方法? –

+0

不确定,但尝试'cell.toString();' – Sankumarsingh