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

我有以下代码:

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截图

任何想法为什么POI产生不同于Excel的价值? 有没有办法configuration兴趣点,以便它返回相同的值(即服从与Excel相同的舍入algorithm)?

我用xls(Excel 97-2013)文件使用POI 3.12。

编辑:这个单元格的java格式是$#,##0 (POI内部)。 以下是Excel显示的内容:

Excel的单元格格式对话框

编辑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 下降

看到这个答案 。 看起来这个问题与某些版本的Java 8中的舍入错误有关。这是用8u40( 发行说明 )修复的。