在java中使用API读取公式时,精度丢失的问题如何解决。具体如下描述。

jerysab 2018-10-20 09:29:17
首先,我这边的需求是在一个界面上输入了公式,然后把界面上的公式获取到,存放到后台的对应excel单元格里。
注:由于写入到excel中直接用String的格式去获取单元格值获取公式是获取不到的。目前发现只有通过Number类型获取,如下图


比如实际的excel中的值是156.3,但是获取到的值确不是这个值。如下excel中的具体值


如下代码获取的具体结果



正常情况下,第一次写入公式,如果不打开excel公式是不会计算的。所以获取不到具体值,如果打开一遍在进行获取就可以获取到。
请问下大神们,目前有什么好的办法解决获取公式的精度丢失吗????急急急

...全文
717 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
北冥有泥鳅 2020-03-24
  • 打赏
  • 举报
回复
引用 9 楼 <span style="color:#4788C7">穿越时空的大叔</span>的回复:
用numberToTextConverter.toText()
<br />这种方式可以 但是当公式单元格没有值时会返回0.0
qq_36966838 2019-07-27
  • 打赏
  • 举报
回复
可以在EXCEL公式外面加上TEXT(),然后再来取单元格的值就好啦
jerysab 2018-11-13
  • 打赏
  • 举报
回复
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=" + value);
			String str = nf.format(value);
			System.out.println("format value=" + str);
		}
为何我用这个代码,必须要打开excel保存以下,才可以获取到有公式的具体值??? 大神们,有没有其他好的解决方案呢??
  • 打赏
  • 举报
回复
你是取得Excel 表格的值不是公式吧?判断是公式类型,可以用string 取值的,不知道你那个evb变量?有什么用
咸哼酒家 2018-10-25
  • 打赏
  • 举报
回复
String.valueof() 都不行吗?
我以前用easy-poi ,金额部分转字符串也没出精度问题啊。
不过2楼得解决方法很好,让我感觉easy-poi可能在API里面已经解决了这个问题了
jerysab 2018-10-25
  • 打赏
  • 举报
回复
引用 4 楼 LCL_data 的回复:
 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 "";
        }
    }
如果是你从某个地方写入公式到excel时,然后在获取excel中对应的具体单元格时,你这种方法是获取不到具体的公式单元格计算出来的值。
jerysab 2018-10-25
  • 打赏
  • 举报
回复
引用 2 楼 qq_32133405 的回复:
/** * * * @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; }
你这种是直接返回excel中公式的具体值吗? 而不是计算后的值?
jerysab 2018-10-25
  • 打赏
  • 举报
回复
引用 15 楼 xiaozhenzhen0123 的回复:
可以用mathContext确保精度
主要是excel中计算的值是156.2,但是代码获取却丢失了。。 你这个没怎么用过,不知道是否可行
  • 打赏
  • 举报
回复
可以用mathContext确保精度
jerysab 2018-10-25
  • 打赏
  • 举报
回复
引用 11 楼 xiaozhenzhen0123 的回复:
numberToTextConverter.toText(row.geCell(i).getNumericCellValue)
主要是我这边是获取excel中公式的。
jerysab 2018-10-25
  • 打赏
  • 举报
回复 1
引用 9 楼 xiaozhenzhen0123 的回复:
用numberToTextConverter.toText()
试了这种方式,还是会有精度丢失。
  • 打赏
  • 举报
回复
返回的是一个string
  • 打赏
  • 举报
回复
numberToTextConverter.toText(row.geCell(i).getNumericCellValue)
jerysab 2018-10-25
  • 打赏
  • 举报
回复
引用 9 楼 xiaozhenzhen0123 的回复:
用numberToTextConverter.toText()
有详细的代码参考下吗?非常感谢
  • 打赏
  • 举报
回复
用numberToTextConverter.toText()
jerysab 2018-10-25
  • 打赏
  • 举报
回复
引用 7 楼 CEOCAO 的回复:
String.valueof() 都不行吗? 我以前用easy-poi ,金额部分转字符串也没出精度问题啊。 不过2楼得解决方法很好,让我感觉easy-poi可能在API里面已经解决了这个问题了
2楼只是获取了单元格里的具体公式的值,但是我需要获取计算后的值
十八道胡同 2018-10-24
  • 打赏
  • 举报
回复
 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 "";
}
}
十八道胡同 2018-10-24
  • 打赏
  • 举报
回复
mark学习下,关注后续大神答案
今逍遥 2018-10-24
  • 打赏
  • 举报
回复
/**
*
*
* @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;
}
jerysab 2018-10-23
  • 打赏
  • 举报
回复
大神呢,进来帮忙看看拉

50,545

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧