优于单元格值精度

时间:2017-05-27 11:41:32

标签: java excel apache apache-poi aspose

我正在使用Apache POI来检索单元格双精度值:

1.以openxml格式存储的单元格的实际值为“5.259761432023309”, 2.同一单元格的格式化显示值为“5.26%”。 3.但是,在MS Excel公式栏上显示的值是“5.25976143202331%”

使用Apache POI,我能够检索:

值1,使用cell.getNumericValue();

我也能够检索 值2,使用DataFormatter df = new DataFormatter(); String asItLooksInExcel = df.formatCellValue(cell);

但是,我无法检索值3,这是公式栏上显示的值,plz建议检索相同的方法。

3 个答案:

答案 0 :(得分:1)

我无法确认您的观察结果。

如果我有以下Excel:

enter image description here

5.25976143202331%中看到A1。它是德语Excel所以小数点分隔符是逗号。但这没关系。

XML是:

<sheetData>
 <row r="1" spans="1:1" x14ac:dyDescent="0.25">
  <c r="A1" s="1">
   <v>5.2597614320233098E-2</v>
  </c>
 </row>
</sheetData>

以下代码

import org.apache.poi.xssf.usermodel.*;
import org.apache.poi.ss.usermodel.*;

import org.apache.poi.ss.format.CellNumberFormatter;

import java.io.*;

import java.math.BigDecimal;
import java.util.Locale;

class ExcelProcentValuePrecision {

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

  InputStream inp = new FileInputStream("ExcelProcentValuePrecision.xlsx");
  Workbook workbook = WorkbookFactory.create(inp);

  Cell cell = workbook.getSheetAt(0).getRow(0).getCell(0);

  String s = ((XSSFCell)cell).getCTCell().getV();
  System.out.println(s);

  BigDecimal bd = new BigDecimal(s);
  System.out.println(bd);

  double d = cell.getNumericCellValue();
  System.out.println(d);

  Locale.setDefault(Locale.US);

  DataFormatter dataformatter = new DataFormatter();
  s = dataformatter.formatCellValue(cell);
  System.out.println(s);

  CellNumberFormatter formatter = new CellNumberFormatter("#.#################%");
  s = formatter.format(cell.getNumericCellValue());
  System.out.println(s);

  workbook.close();

 }
}

导致:

enter image description here

所以5.2597614320233098E-2是直接来自XML的值。 0.052597614320233098将该值视为BigDecimal0.0525976143202331根据IEEE floating point,该值为浮点double5.26%是格式化为Excel中显示的值。

5.25976143202331%Excel公式栏中显示的值。百分比值是一种特殊情况,因为Excel在公式栏中也显示%格式,但完整计算有效数字(最多15个)。

包含%值的异常是因为%中的Excel格式不仅是格式化,而且还是值的更改。 1 = 100%。因此,如果您将100%放在Excel单元格中,则会存储值1。如果您将10%放在Excel单元格中,则会存储值0.1

答案 1 :(得分:0)

如果是 Aspose.Cells API ,请使用以下示例Excel文件测试给定的示例代码。另请参阅其图像和控制台输出。

所有这些都解释了Aspose.Cells API以真实精度准确检索单元格A1值。

Screenshot

示例代码

//Load source workbook
Workbook wb = new Workbook(dirPath + "sampleExcelCellValuePrecision.xlsx");

//Access first worksheet
Worksheet ws = wb.getWorksheets().get(0);

//Access cell A1
Cell a1 = ws.getCells().get("A1");

//The value is double which is shown as
System.out.println("Double Value: " + a1.getValue());

//This is the value shown by Microsoft Excel
System.out.println("String Value: " + a1.getStringValue());

控制台输出

Double Value: 0.0525976143202331
String Value: 5.26%

注意: 我在Aspose担任开发人员传播者

答案 2 :(得分:0)

在这里查看我的答案: https://stackoverflow.com/a/58732907/12332761

此函数应该产生与在编辑栏中看到的相同的东西:

    private static BigDecimal stringedDouble(Cell cell) {
            BigDecimal result =  new BigDecimal(String.valueOf(cell.getNumericCellValue())).stripTrailingZeros();
            result = result.scale() < 0 ? result.setScale(0) : result;
            return result;
    }