2017-05-27 10 views
0

ich Apache POI bin mit einem Zellen doppelten Wert abzurufen:Excel-Zelle Wert Präzision

1.Die tatsächlichen Wert der Zelle in OpenXML-Format gespeichert ist „5,259761432023309“, 2. formatiert Anzeigewert des gleichen Zelle ist "5,26%". 3.However den Wert auf der MS Excel Leiste zeigt, ist "5,25976143202331%"

Verwendung von Apache POI, ich in der Lage zu erhalten:

Wert 1, mit cell.getNumericValue();

Ich bin auch in der Lage Wert 2, mit DataFormatter df = new DataFormatter() abzurufen; String asItLooksInExcel = df.formatCellValue (Zelle);

Ich kann jedoch Wert 3 nicht abrufen, was der Wert ist, der in der Formelleiste angezeigt wird, und es werden Möglichkeiten zum Abrufen derselben angegeben.

+1

Wenn Sie alle es wollen, werden Sie es als String behandeln müssen. – pnuts

Antwort

1

Ich kann Ihre Beobachtungen nicht bestätigen.

Wenn ich die folgenden Excel habe:

enter image description here

Wie Sie 5.25976143202331% in A1 sehen. Es ist eine deutsche Excel so Dezimaltrennzeichen ist Komma. Aber das macht nichts.

das Es XML ist:

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

Und der folgende Code

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(); 

} 
} 

führt zu:

enter image description here

So 5.2597614320233098E-2 ist der Wert direkt aus dem XML . 0.052597614320233098 ist dieser Wert als BigDecimal. 0.0525976143202331 ist dieser Wert als Gleitkomma double nach IEEE floating point. 5.26% ist der Wert, der wie in Excel angezeigt formatiert wird.

Und 5.25976143202331% ist dieser Wert wie in Excel 's Formelleiste angezeigt. Prozentwerte sind ein Ausnahmefall, da dort Excel das Format % auch in Formelleiste anzeigt, aber mit voller Zählung der signifikanten Ziffern (bis zu 15).

Diese Ausnahme mit % Werten ist, weil % in Excel Formatierung nicht nur formatiert, sondern auch den Wert zu verändern. 1 = 100%. Wenn Sie also 100% in eine Excel Zelle setzen, wird der Wert 1 gespeichert. Wenn Sie 10% in eine Excel Zelle setzen, wird der Wert 0.1 gespeichert.

0

Im Fall von Aspose.Cells API, bitte testen Sie den angegebenen Beispielcode mit der folgenden Beispiel-Excel-Datei. Bitte beachten Sie auch die Bild- und Konsolenausgabe.

All diese Dinge erklären, dass Aspose.Cells API den Zelle A1-Wert mit wahrer Genauigkeit genau abruft.

Screenshot

Beispielcode

//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()); 

Konsolenausgabe

Double Value: 0.0525976143202331 
String Value: 5.26% 

Hinweis: ich als Entwickler Evangelist arbeite an Aspose