Apache-POI - 如何在Cell-Editor中像Excel那样舍入数字

时间:2018-02-20 16:31:06

标签: java excel apache-poi

我使用Apache-POI" XSSF和SAX事件API"用于导入Excel文件。

我使用Apache-POI解析Raw-Values并且想要问一下,我怎样才能完全像Excel-GUI为Cell-Editor那样舍入那些Raw-Values。以下示例说明了问题:

Raw:      1.9210999999999999E-2     (value is stored like this in xlsx-file)
Edit:     1.9211%                   (user sees this value in excel cell-editor)
View:     1.92%                     (user sees this value in excel grid-overview)
Format:   0.00%                     (the cell-style)

Excel如何将Raw-Value读取为Edit-Value? Excel如何知道它需要在小数分隔符后舍入到4位数的小数。 Apache POI如何帮助我这样做,所以我也可以在Excel-Import中使用Edit-Value(而不是View-Value)?

我看过类似的Ticket,它涵盖了Excel的用途:How does Excel successfully Rounds Floating numbers even though they are imprecise?

在这个Ticket中我想问一下,Apache POI如何帮助我,所以我不需要在这里重新发明轮子,并实现Excels算法。

1 个答案:

答案 0 :(得分:2)

Excel根据IEEE 754规范获取double值,然后在显示在工作表中之前将其舍入为15位有效数字。

要做同样的事情,可以根据15位精度的BigDecimal设置使用MathContext四舍五入。

import java.math.BigDecimal;
import java.math.MathContext;

class ReadLongNumbersAsExcel {

 public static void main(String[] args) throws Exception{

  String v = "1.921099999999999E-2";
  double d = Double.parseDouble(v);
  System.out.println("raw: " + v);
  System.out.println("double: " + d);
  BigDecimal bd = new BigDecimal(d);
  v = bd.round(new MathContext(15)).toPlainString();
  System.out.println("like Excel: " + v);

 }
}

%案例是一个特殊情况,因为Excel在这种情况下显示的不是真正存储的值,而是显示此值乘以100后跟“%”。所以,如果你想要相同,那么做同样的事情。将原始值四舍五入到15位后,再乘以100并附加“%”。

但如果只需要像Excel一样获取格式化值,请参阅How to check a number in a string contains a date and exponential numbers while parsing excel file using apache event model in java