2017-05-27 146 views
0

我使用Apache POI檢索的小區雙值:Excel單元格值精度

1.實際存儲在OpenXML格式的細胞的值是「5.259761432023309」, 2.相同的格式化的顯示值細胞是「5.26%」。 3.However表示MS Excel公式欄上的值是 「5.25976143202331%」

使用Apache POI,我能夠檢索:

值1,使用cell.getNumericValue();我也可以檢索 值2,使用DataFormatter df = new DataFormatter(); String asItLooksInExcel = df.formatCellValue(cell);

但是,我無法檢索值3,這是公式欄上顯示的值,PLZ建議檢索相同的方法。

+1

如果你想這一切,你必須把它作爲一個字符串。 – pnuts

回答

1

我無法確認您的意見。

如果我有以下的Excel:

enter image description here

正如你在A1看到5.25976143202331%。這是德文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是作爲BigDecimal的值。 0.0525976143202331是根據IEEE floating point作爲浮點數double的值。 5.26%是格式如Excel中顯示的值。

5.25976143202331%Excel的公式欄中顯示的值。百分比值是一種例外情況,因爲Excel在公式欄中也顯示%格式,但具有完整的有效數字位數(最多15個)。

%值的例外是因爲Excel中的%格式不僅格式化而且還改變了值。 1 = 100%。因此,如果您將100%放入Excel單元中,則會存儲值1。如果您將10%放入Excel單元中,則會存儲值0.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工作