首先,我這邊的需求是在一個界面上輸入了公式,然后把界面上的公式獲取到,存放到后臺的對應excel單元格里。
注:由于寫入到excel中直接用String的格式去獲取單元格值獲取公式是獲取不到的。目前發現只有通過Number型別獲取,如下圖

比如實際的excel中的值是156.3,但是獲取到的值確不是這個值。如下excel中的具體值

如下代碼獲取的具體結果

正常情況下,第一次寫入公式,如果不打開excel公式是不會計算的。所以獲取不到具體值,如果打開一遍在進行獲取就可以獲取到。
請問下大神們,目前有什么好的辦法解決獲取公式的精度丟失嗎????急急急
uj5u.com熱心網友回復:
大神呢,進來幫忙看看拉uj5u.com熱心網友回復:
/***
*
* @param cell
* @return 根據cell的型別,回傳cell的值
*/
public static String getCellValue(Cell cell) {
String cellValue = "";
if (cell == null) {
return cellValue;
}
// 把數字當成String來讀,避免出現1讀成1.0的情況
if (cell.getCellType() == CellType.NUMERIC) {
cell.setCellType(CellType.STRING);
}
// 判斷資料的型別
switch (cell.getCellType()) {
case NUMERIC: // 數字
cellValue = String.valueOf(cell.getNumericCellValue());
break;
case STRING: // 字串
cellValue = String.valueOf(cell.getStringCellValue());
break;
case BOOLEAN: // Boolean
cellValue = String.valueOf(cell.getBooleanCellValue());
break;
case FORMULA: // 公式
cellValue = String.valueOf(cell.getCellFormula());
break;
case BLANK: // 空值
cellValue = "";
break;
case ERROR: // 故障
cellValue = "Error";
break;
default:
cellValue = "default";
break;
}
return cellValue;
}
uj5u.com熱心網友回復:
mark學習下,關注后續大神答案uj5u.com熱心網友回復:
public static String getStringVal(HSSFCell cell) {
DecimalFormat df = new DecimalFormat("#");
switch (cell.getCellType()) {
case Cell.CELL_TYPE_BOOLEAN:
return cell.getBooleanCellValue() ? "TRUE" : "FALSE";
case Cell.CELL_TYPE_FORMULA:
return cell.getCellFormula();
case Cell.CELL_TYPE_NUMERIC:
if (HSSFDateUtil.isCellDateFormatted(cell)) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return sdf.format(HSSFDateUtil.getJavaDate(cell.getNumericCellValue()));
}
return df.format(cell.getNumericCellValue());
case Cell.CELL_TYPE_STRING:
return cell.getStringCellValue();
default:
return "";
}
}
uj5u.com熱心網友回復:
你這種是直接回傳excel中公式的具體值嗎? 而不是計算后的值?uj5u.com熱心網友回復:
如果是你從某個地方寫入公式到excel時,然后在獲取excel中對應的具體單元格時,你這種方法是獲取不到具體的公式單元格計算出來的值。uj5u.com熱心網友回復:
String.valueof() 都不行嗎?我以前用easy-poi ,金額部分轉字串也沒出精度問題啊。
不過2樓得解決方法很好,讓我感覺easy-poi可能在API里面已經解決了這個問題了
uj5u.com熱心網友回復:
2樓只是獲取了單元格里的具體公式的值,但是我需要獲取計算后的值
uj5u.com熱心網友回復:
用numberToTextConverter.toText()uj5u.com熱心網友回復:
有詳細的代碼參考下嗎?非常感謝
uj5u.com熱心網友回復:
numberToTextConverter.toText(row.geCell(i).getNumericCellValue)uj5u.com熱心網友回復:
回傳的是一個stringuj5u.com熱心網友回復:


試了這種方式,還是會有精度丟失。
uj5u.com熱心網友回復:
主要是我這邊是獲取excel中公式的。
uj5u.com熱心網友回復:
可以用mathContext確保精度uj5u.com熱心網友回復:
主要是excel中計算的值是156.2,但是代碼獲取卻丟失了。。 你這個沒怎么用過,不知道是否可行
uj5u.com熱心網友回復:
你是取得Excel 表格的值不是公式吧?判斷是公式型別,可以用string 取值的,不知道你那個evb變數?有什么用uj5u.com熱心網友回復:
NumberFormat nf = NumberFormat.getInstance();
nf.setGroupingUsed(true);
nf.setMinimumFractionDigits(12);
if (type == CellType.FORMULA) {
System.out.println("cell type=CellType.FORMULA");
double value = cell.getNumericCellValue();
System.out.println("value="https://bbs.csdn.net/topics/ + value);
String str = nf.format(value);
System.out.println("format value="https://bbs.csdn.net/topics/ + str);
}
為何我用這個代碼,必須要打開excel保存以下,才可以獲取到有公式的具體值??? 大神們,有沒有其他好的解決方案呢??
uj5u.com熱心網友回復:
可以在EXCEL公式外面加上TEXT(),然后再來取單元格的值就好啦uj5u.com熱心網友回復:
<br />這種方式可以 但是當公式單元格沒有值時會回傳0.0轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/108866.html
標籤:Java相關
