我有两个excel表(一个.xls,一个.xlsx),单元格A1中的内容为“1234567891234.56”。
现在我试图将这些内容添加到我的java-app中,使用这样的Apache POI:
private String getValue(Cell myCell, int myCelltype)
throws CellAccessException {
try {
switch (myCelltype) {
case org.apache.poi.ss.usermodel.Cell.CELL_TYPE_STRING:
return myCell.getStringCellValue();
...
首先,CellType(myCell.getCellType())总是1(String),无论我如何格式化单元格本身。
其次,当我从xlsx阅读时,我从xls读取时得到“1234567891234.5601”,我得到了“1234567891234.56”,这是我期望的结果。
另一个例子是文件中的“12345678912345.6”和从xlsx读取的结果“12345678912345.602”。
我不知道,是什么导致了我的问题而其他人似乎没有类似的问题。
感谢您提供任何帮助。
先谢谢德国人的问候。 Ausric
编辑: 感谢您的评论和回答。遗憾的是,格式化返回值没有帮助,因为问题是从Excel工作表中获取正确的值。 在研究不变的CELL_TYPE时,我做了一个奇怪的观察: 当我从xls(!)文件中读取时,我得到了正确的值作为String(在本例中为1.23456789123456E + 20)。接下来,此String将转换为Double。
String content = myCell.getStringCellValue();
System.out.println(result + "#" +result.length());
Double dresult = Double.valueOf(result);
System.out.println(dresult);
输出如下:
1.23456789123456E + 20#20
1.2345678912345601E20
所以我首先想到的是,我从xlsx中的单元格中读取了这个错误,这些单元格是数字,但标记为单元格类型STRING,并将String转换为Double。 Double有什么问题吗?也许我们在这里得到了一些旧的Java版本而Double被打破了。我不认为这是poi的错,因为它是3.10 FINAL并且应该工作正常。或者是在转换此字符串时双重做某事我只是不明白?我是Java新手,也是这份工作......只是苦苦挣扎。
答案 0 :(得分:0)
我不确定默认的十进制格式是否会在xls和xlsx中发生变化。然而,只是建议如果不修复小数位,你应该从你自己的目的修复它... ...
case org.apache.poi.ss.usermodel.Cell.CELL_TYPE_STRING:{
DecimalFormat df = new DecimalFormat("##.##");
return df.format(myCell.getNumericCellValue());