如何在DataFormatter中编辑模式?

时间:2018-08-04 05:55:03

标签: java apache-poi data-formatters

我想用Java在Excel中读取数据,Excel中的单元格数据有两种类型:NUMERICSTRING。因此,当我想以NUMERIC的形式读取数据时,它仅显示数字101125340004,而不像1.01E+11那样显示数字,因为它是电话属性。我的代码可以正常工作,但是对于某些值(1%)仍显示浮点数,但它们实际上是整数,我不知道为什么。

Excel 365工作表中的数据 enter image description here

DataFormatter fmt = new DataFormatter();
if (cellType.toString().equals("NUMERIC"))
    companyTel = fmt.formatCellValue(currentRow.getCell(8));
else
    companyTel = currentRow.getCell(8).toString();  

输出仍然在数据库中获得浮点数 enter image description here

我正在使用的Java Apache POI版本是3.17。

请告诉我上面代码中的错误或如何解决该问题?谢谢大家。

3 个答案:

答案 0 :(得分:2)

Microsoft Excel在使用单元格编号格式General时以科学计数形式转换11位以上的值。因此,8422236221118,42224E+11单元格中以数字格式Excel导致General。如果在Excel中该单元格应显示842223622111,则需要一种特殊的数字格式(0)来代替General

您可以了解available number formats in Excel for Office 365General格式对大数字(12位或更多数字)的特殊行为。

Libreoffice/OpenOffice Calc不会这样做。在数字格式为842223622111的像元中,842223622111停留在General中。

现在,如果apache poi获得了一个包含842223622111并具有数字格式General的单元格,那么DataFormatter将像Excel一样格式化。< / p>

如果您希望DataFormatter的格式应更像Libreoffice/OpenOffice Calc,则可以执行以下操作:

...
DataFormatter fmt = new DataFormatter();
...
fmt.addFormat("General", new java.text.DecimalFormat("#.###############"));
...

使用这种方法,Excel工作表中无需进行任何更改。但是当然可以更改apache poi的{​​{1}}的默认行为。为避免这种情况,您可以使用数字格式DataFormatter将受影响的单元格设置为Excel,数字格式为0,不带千位分隔符,十进制小数位数= 0。

但是由于您提到此列包含电话号码,所以最常见的解决方案是使用数字格式NumberText)格式化整个列。这“将单元格的内容作为文本进行处理,并且即使键入数字,也完全按照您键入的内容显示内容”。因此,在应用格式之后,就不会再更改为科学计数法了。

答案 1 :(得分:0)

documentation说:

  

在内部,将使用Format的子类来实现格式   例如DecimalFormat和SimpleDateFormat。因此使用的格式   该类必须遵循与这些Format相同的模式规则   子类。这意味着只有合法的数字模式字符(“ 0”,   “#”,“。”,“。”等可能以数字格式出现。其他字符可以   在数字模式之前或之后插入以形成前缀或   后缀。

     

例如Excel模式“ $#,## 0.00” USD“ _);($#,## 0.00” USD“)”   的格式将正确设置为“ $ 1,000.00 USD”或“(($ 1,000.00 USD)””。   但是,模式“ 00-00-00”的格式不正确   DecimalFormat为“ 000000--”。对于不兼容的Excel格式   使用DecimalFormat,您可以提供自己的自定义格式   通过DataFormatter.addFormat(String,Format)实现。的   此类已经提供了以下自定义格式:

     
      
  • SSN“ 000-00-0000”
  •   
  • 电话号码“(###)###-####”
  •   
  • 邮政编码加4个“ 00000-0000”
  •   

您还可以添加自己的格式,如下所示:

DataFormatter.addFormat(String, Format)

答案 2 :(得分:0)

尝试此操作可能会帮助您:-

HSSFCell cellE1 = row1.getCell((short) 4);
cellE1.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
Double e1Val = cellE1.getNumericCellValue();
BigDecimal bd = new BigDecimal(e1Val.toString());
long lonVal = bd.longValue();
System.out.println(lonVal);