一次excle导入数值精度失真处理过程(附java、python、goland实现代码)

2023-11-18

在一次excle导入中通过java poi包导入数值过长时出现数值失真的问题。

100283710028672000000 在通过java导入时变成了100283710028672010000 ​

现在通过goland 、java 、python三种语言对导入过程进行展示 ​

java代码如下

public class Hello {

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

NumberFormat numberFormat = NumberFormat.getInstance( ); numberFormat.setGroupingUsed(false); String filePath = "D:\test.xlsx";

InputStream is = new FileInputStream(filePath);

XSSFWorkbook wb = new XSSFWorkbook(is);

XSSFSheet sheet = wb.getSheetAt(0); Row row = sheet.getRow(1);

Cell cell = row.getCell(1); String val = String.valueOf(numberFormat.format(cell.getNumericCellValue()));

// String val = cell.getStringCellValue();

BigDecimal b = new BigDecimal(val);

 System._out_.println(b);
​
}

}

网上主要的解决方法都提高了这行代码 String val = String.valueOf(numberFormat.format(cell.getNumericCellValue())); 通过修改之后没有起到作用。 ​

朋友在网上发帖某位大佬回复提示以下两个链接 Apache POI not returning the proper value for large numbers coming from Excel - Stack Overflow

DataFormatter (POI API Documentation)

修改代码如下,主要修改为红色部分。

public class Hello {

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

NumberFormat numberFormat = NumberFormat.getInstance( ); numberFormat.setGroupingUsed(false);

String filePath = "D:\test.xlsx";

InputStream is = new FileInputStream(filePath);

XSSFWorkbook wb = new XSSFWorkbook(is);

XSSFSheet sheet = wb.getSheetAt(0);

Row row = sheet.getRow(1);

Cell cell = row.getCell(1);

String val = String.valueOf(numberFormat.format(cell.getNumericCellValue()));

// String val = cell.getStringCellValue();

BigDecimal b = new BigDecimal(val);

System.out.println(b);

String v = b.round(new MathContext(15)).toPlainString(); //解决问题的关键代码 System.out.println(v);

}

} ​

再次运行输出正确结果 Connected to the target VM, address: '127.0.0.1:50228', transport: 'socket' ERROR StatusLogger Log4j2 could not find a logging implementation. Please add log4j-core to the classpath. Using SimpleLogger to log to the console... 100283710028672010000 100283710028672000000 Disconnected from the target VM, address: '127.0.0.1:50228', transport: 'socket' ​

goland代码

突发奇想通过go语言对此excle进行处理,这里使用的为excelize这个工具包。 具体的操作方法可以这位大佬的文章 快速开始 · Excelize 简体字文档 内容解释的相当丰富。 ​

go get github.com/xuri/excelize/v2 ​

安装依赖包 通过运行测试输出结果正常 ​

API server listening at: [::]:65052 100283710028672000000 出口时间 最终轴组信息 总重(kg) 2/1/16 00:00 100283710028672000000 1400

goland代码如下

package main ​

import ( "fmt" ​

"github.com/xuri/excelize/v2"

) ​

func main() {

f, err := excelize.OpenFile("D:\test.xlsx")

if err != nil { fmt.Println(err) return } // 获取工作表中指定单元格的值 cell, err := f.GetCellValue("Sheet1", "B2") if err != nil { fmt.Println(err) return } fmt.Println(cell)

// 获取 Sheet1 上所有单元格

rows, err := f.GetRows("Sheet1") i

f err != nil { fmt.Println(err) return }

for _, row := range rows { for _, colCell := range row { fmt.Print(colCell, "\t") } fmt.Println() }

// 关闭工作簿

if err = f.Close(); err != nil { fmt.Println(err) } } ​

python代码

python代码如下 使用xlrd

from decimal import Decimal

import xlrd import xlwt

import xlutils import os

workbook = xlrd.open_workbook(r'D:\test.xls')

print(workbook.sheet_names()) _# ----读取sheet---- _

table = workbook.sheets()[0]

print(table.row(1)[1].value)

print(Decimal(table.row(1)[1].value)) ​

打印结果依然有问题

D:\python_WorkSpace\venv\Scripts\python.exe "D:\Program Files\JetBrains\PyCharm 2021.2.1\plugins\python\helpers\pydev\pydevd.py" --multiproc --qt-support=auto --client 127.0.0.1 --port 60151 --file D:/python_WorkSpace/excletest/excleimport.py Connected to pydev debugger (build 212.5080.64) ['Sheet1'] 1.00283710028672e+20 100283710028672008192 ​

切换python依赖插件openpyxl

from decimal import Decimal

import numpy as np

import openpyxl

workbook = openpyxl.load_workbook("D:/test.xlsx") sheet1 = workbook.active print(Decimal(sheet1['B2'].value)) np.set_printoptions(suppress=True) print(str(Decimal(sheet1['B2'].value)))

for row in sheet1.rows: for item in row: print(item.value) ​

输出日志问题尚未解决 ​

D:\python_WorkSpace\venv\Scripts\python.exe "D:\Program Files\JetBrains\PyCharm 2021.2.1\plugins\python\helpers\pydev\pydevd.py" --multiproc --qt-support=auto --client 127.0.0.1 --port 52534 --file D:/python_WorkSpace/excletest/excleimportopen.py Connected to pydev debugger (build 212.5080.64) 100283710028672008192 100283710028672008192 出口时间 最终轴组信息 总重(kg) 2016-02-01 00:00:00 1.00283710028672e+20 1400 Process finished with exit code 0 ​

python 处理依然存在问题。。。。。。。。。。。。。。。。。 解决方法尚未提出。。。。。。。。。。。。。。。。。。。。。 后续会继续进行更新。。。。。。。。。。。。。。。。。。。。 ​

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一次excle导入数值精度失真处理过程(附java、python、goland实现代码) 的相关文章

随机推荐

  • jdk报错

    Syntax error annotations are only available if source level is 1 5 or greater解决方法 原创 2016年07月18日 14 13 39 ul class artic
  • Java内存分配全面浅析

    本文将由浅入深详细介绍Java内存分配的原理 以帮助新手更轻松的学习Java 这类文章网上有很多 但大多比较零碎 本文从认知过程角度出发 将带给读者一个系统的介绍 进入正题前首先要知道的是Java程序运行在JVM Java VirtualM
  • 多维随机变量及其分布(四):

    一 二维随机变量及其分布函数 1 二维随机变量 设随机变量 Z X Y 则有 Z X Y 一个随机变量是有两个随机变量决定的 2 联合分布函数的基本性质 单调性 F x y 分别对x 或y是单调不减的 即 对任意固定的y 当 x1 lt x
  • 【SPI】STM32 SPI 双机通信,SPI从机模式使用

    文章目录 一 SPI主机配置 二 SPI从机配置 三 双机通信 1 轮询 中断 低速 2 轮询 DMA 低速 3 DMA DMA 高速 4 开启CRC校验 自选 四 遇到的问题 1 高速使用时 程序卡死 或者数据出错 已解决 2 数据莫名其
  • html制作日程安排,在线日程安排怎样做?日程表在线制作工具

    在线日程安排怎样做 日程表在线制作工具 在线日程安排怎样做 每日仅有二十四小时 可在一天我们要做的事却太多 每日忙的晕头转向 身心俱疲 这可咋办啊 戴尔 麦康基说过 计划的订制比计划本身更为重要 因此可见 订制好每日的行程安排是不可或缺的
  • 详述String类的equals方法

    详述String类的equals方法 1 两个String类的对象采取直接赋值 ublic class Test public static void main String args String name1 Tom String nam
  • java基础语法之面向对象

    面向对象 面向对象是一种编程思想 与之对应的是面向过程 区别 面向过程 POP 强调的是功能 面向对象 OOP 强调的是带有具体功能的对象 面向对象的优点 提高代码复用性 降低代码间的耦合度 提升代码维护性 三大特征 封装 继承 多态 一
  • 六种黑客入侵手机的常见方式

    六种黑客入侵手机的常见方式 在移动网络科技高速发展的今天 我们每个人的手机都有可能成为黑客攻击的对象 下面为大家介绍6种黑客入侵手机的常见方式 希望能够帮助大家避免手机被不对象攻击 1 网络钓鱼攻击 网络钓鱼攻击非常普遍 那是因为它们非常有
  • 磁盘空间重分配

    root localhost df h Filesystem Size Used Avail Use Mounted on dev mapper VolGroup lv root 50G 47G 16M 100 lv root满了 tmpf
  • pageHelper的使用与源码分析

    文章目录 一 使用步骤 二 分页原理 1 统计总数 2 源码分析 三 总结 pageHelper作为Mybatis最好用的分页插件 自然受到极大多数人的追捧 而这里想要尽量阐述清楚pageHelper的具体使用步骤 实现的背后原理 以及与原
  • WebGL 实践篇(五)三维图形的绘制及矩阵变换、正射投影

    一 三维 F 的绘制 1 着色器 按照上一篇提到的矩阵变换 我们可以直接在顶点着色器中加入相应的矩阵变换 这样就可以简化着色器代码 通过变量传入矩阵的值也便于之后矩阵变换的修改 三维图形的绘制相比于二维图形只在参数类型上有一些变化 注意ve
  • Dynamically inflates UI in Android App

    Dynamically inflates UI in Android App There is a fascinating idea that inflates UI according to an android layout xml d
  • Spring Cloud OAuth2 + JWT 实现

    Spring Cloud OAuth2介绍 Spring Cloud OAuth2 是 Spring Cloud 体系对OAuth2协议的实现 可以 来做多个微服务的统 认证 验证身份合法性 授权 验证权限 通过向OAuth2服务 统 认证
  • 信息学奥赛一本通 1175:除以13

    题目链接 http ybt ssoier cn 8088 problem show php pid 1175 思路 直接复用 高精度除低精度 的代码即可 include
  • 简洁又快速地处理集合——Java8 Stream(上)

    Java 8 发布至今也已经好几年过去 如今 Java 也已经向 11 迈去 但是 Java 8 作出的改变可以说是革命性的 影响足够深远 学习 Java 8 应该是 Java 开发者的必修课 今天给大家带来 Java 8 Stream 讲
  • signature=8b42938f09e2cf752303c59298e18eae,yarn.lock

    THIS IS AN AUTOGENERATED FILE DO NOT EDIT THIS FILE DIRECTLY yarn lockfile v1 babel code frame 7 0 0 beta 40 babel code
  • 数据分析---常见分类算法

    分类问题是监督学习的一个核心问题 在监督学习中 当输出变量取有限个离散值时 预测问题便成为分类问题 监督学习从数据中学习一个分类决策函数或分类模型 称为分类器 classifier 分类器对新的输入进行输出的预测 这个过程称为分类 KNN算
  • pyQt5 + pyUIC + pycharm 安装心得(Anaconda安装)

    目录 前言 一 环境变量问题 二 anaconda 安装 pyqt5 并配置 pycharm 编译器 1 首先我们打开Anaconda里面的Anaconda prompt 2 创建好环境后我们输入 activate pyqt5 进入我们的虚
  • 论文笔记: MOGRIFIER LSTM

    2020 ICLR 修改传统LSTM 当前输入和隐藏状态充分交互 从而获得更佳的上下文相关表达 1 Mogrifier LSTM LSTM的输入X和隐藏状态H是完全独立的 机器学习笔记 GRU gruc UQI LIUWJ的博客 CSDN博
  • 一次excle导入数值精度失真处理过程(附java、python、goland实现代码)

    在一次excle导入中通过java poi包导入数值过长时出现数值失真的问题 100283710028672000000 在通过java导入时变成了100283710028672010000 现在通过goland java python三种