java - 如何检索与Excel中显示的结果相同的单元格值?

标签 java excel apache-poi rounding

我有以下代码:

Workbook workbook = WorkbookFactory.create( file );
Sheet sheet = workbook.getSheet( "Sheet1" );
FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator();
DataFormatter formatter = new DataFormatter( true );

int rowNum = 0;
int colNum = 0;
Row row = sheet.getRow( rowNum );
Cell cell = row.getCell( colNum );

double rawCellValue = cell.getNumericCellValue();
System.out.println( "raw value: " + rawCellValue );

String cellValue = formatter.formatCellValue( cell, evaluator );
System.out.println( "formatted: " + cellValue );

这会产生输出:

raw value: 1713.6
formatted: $1,713

当我在 Excel Professional 2010 中打开该文件时,该值显示为 $1,714

Excel screenshot

您知道 POI 产生的值与 Excel 不同的原因吗?有没有办法配置 POI,使其返回相同的值(即遵循与 Excel 相同的舍入算法)?

我正在使用带有 xls (Excel 97-2013) 文件的 POI 3.12。

编辑:此单元格的 java 格式为 $#,##0(POI 内部)。 Excel 显示如下:

Excel's cell format dialog

编辑2:也许这是Java的问题,而不是POI的问题。代码如下:

double number = 1713.6;
System.out.println( "double   : " + number );

DecimalFormat format = new DecimalFormat("#0");

format.setRoundingMode( RoundingMode.HALF_DOWN );
System.out.println( "HALF_DOWN: " + format.format( number ) );

format.setRoundingMode( RoundingMode.HALF_UP );
System.out.println( "HALF_UP  : " + format.format( number ) );

产生结果:

double   : 1713.6
HALF_DOWN: 1714
HALF_UP  : 1713

为什么 HALF_DOWN 会向上舍入,而 HALF_UP 会向下舍入?

最佳答案

参见this answer 。看起来问题与 rounding bug 有关在 java 8 的某些版本中。此问题已通过 8u40 ( Release Notes ) 修复。

关于java - 如何检索与Excel中显示的结果相同的单元格值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30608317/

相关文章:

java - 为什么 24 * 60 * 60 * 1000 * 1000 除以 24 * 60 * 60 * 1000 在 Java 中不等于 1000?

java - 将静态方法传递给另一个 Activity

c# - 单元格值在 excel 中读取为 ####

excel - 指定键盘快捷键来运行程序

java - 使用 Apache POI 评估 Excel 公式

java - 使用 Apache poi 在 excel 中查找特定列中的最后一行 no

java - 如何使用控制反转在java中创建即插即用代码?

vba - 引用单元格时出现错误 9

java - 使用 POI 从 Excel 工作表获取日期

java - JavaFX TableView不会在初始化方法之外更新