如何检索与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
任何想法为什么POI产生不同于Excel的价值? 有没有办法configuration兴趣点,以便它返回相同的值(即服从与Excel相同的舍入algorithm)?
我用xls(Excel 97-2013)文件使用POI 3.12。
编辑:这个单元格的java格式是$#,##0
(POI内部)。 以下是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( 发行说明 )修复的。