如何从 Excel 单元格获取完整值,而不是显示的(四舍五入)值?

2023-12-28

我在从工作表的单元格检索确切值时遇到问题。如果我打开文件,单元格有一个十进制数,仅显示 4 位小数,但如果我单击特定单元格,则该值会不同,有 6 位小数。我知道这是应用于单元格的设置,以便仅显示 4 位小数。

现在我尝试使用 ClosedXML.Excel 而不是 Microsoft.Office.Interop.Excel 在 C# 中检索单元格的数据,但我唯一能得到的是 4 位小数值,而不是“整个”值,这是一个很大的问题,因为我稍后要进行计算,并且由于缺少 2 位小数,我有很大的差异。

我尝试过使用inputSheet.Worksheet.Cell(row,col).GetDouble(), or Convert.ToDouble(inputSheet.Worksheet.Cell(row, col).Value),或者甚至引用“RichText”属性,或...ToString(“0.000000”),但无论我使用什么,我只能检索 4 位小数值,而不是完整的 6 位小数。


我查看了该库的源代码,这就是Valuegetter 的作用是:

get
{
    string str = this.FormulaA1;
    if (!XLHelper.IsNullOrWhiteSpace(str))
    {
        string str2;
        string sName;
        if (str[0] == '{')
        {
            str = str.Substring(1, str.Length - 2);
        }
        if (str.Contains<char>('!'))
        {
            sName = str.Substring(0, str.IndexOf('!'));
            if (sName[0] == '\'')
            {
                sName = sName.Substring(1, sName.Length - 2);
            }
            str2 = str.Substring(str.IndexOf('!') + 1);
        }
        else
        {
            sName = this.Worksheet.Name;
            str2 = str;
        }
        if (this._worksheet.Workbook.WorksheetsInternal.Any<XLWorksheet>(w => (string.Compare(w.Name, sName, true) == 0)) && XLHelper.IsValidA1Address(str2))
        {
            return this._worksheet.Workbook.Worksheet(sName).Cell(str2).Value;
        }
        object obj2 = this.Worksheet.Evaluate(str);
        IEnumerable enumerable = obj2 as IEnumerable;
        if ((enumerable != null) && !(obj2 is string))
        {
            using (IEnumerator enumerator = enumerable.GetEnumerator())
            {
                while (enumerator.MoveNext())
                {
                    return enumerator.Current;
                }
            }
        }
        return obj2;
    }
    string s = this.HasRichText ? this._richText.ToString() : this._cellValue;
    if (this._dataType == XLCellValues.Boolean)
    {
        return (s != "0");
    }
    if (this._dataType == XLCellValues.DateTime)
    {
        return DateTime.FromOADate(double.Parse(s));
    }
    if (this._dataType == XLCellValues.Number)
    {
        return double.Parse(s);
    }
    if (this._dataType == XLCellValues.TimeSpan)
    {
        return TimeSpan.Parse(s);
    }
    return s;
}

我注意到,当它达到string s = this.HasRichText ? this._richText.ToString() : this._cellValue;,如果你从未打电话过cell.RichText(所以既不使用调试器查看它)你会得到正确的值,因为this.HasRichText为 false,因为该类尚未为其分配正确的值。 当它(this.HasRichText) is true, 你得到this._richText.ToString(),即格式化后的数字。 因此,如果您访问Value访问之前的属性RichText你应该得到正确的值,无论如何你可以获得_cellValue使用反射,然后将其转换为double像这样:

var theRealDoubleValue = Convert.ToDouble(yourCell.GetType().GetField("_cellValue", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).GetValue(yourCell));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从 Excel 单元格获取完整值,而不是显示的(四舍五入)值? 的相关文章

随机推荐

  • NGINX:“客户端在读取客户端请求行时发送了无效方法”

    为 Nginx 设置 SSL 并发出请求后 我收到带有神秘消息的乱码响应client sent invalid method while reading client request line 我在 Alpine Docker 容器中使用
  • 以编程方式获取 iOS 设备的 IMEI 或 UDID

    1 Apple 是否允许开发者检索用户设备的 IMEI 号码和 UDID 2 如何以编程方式获取这些值 3 如果 Apple 不允许开发人员收集 IMEI 号码 他们是否会为设备提供任何其他唯一号码 Apple 不再允许开发人员以编程方式获
  • 模板、内部结构、局部类型和纯虚函数,天哪

    考虑一个示例 其中方法是纯虚拟的 采用模板类型的参数 从外部类型注入 并且该模板类型是本地类型 在函数体中定义 这种情况会导致 g 下的编译时错误 诚然 这是一个相当极端的情况 但它确实源自真实的代码 这是一个可编译 可重现的示例 incl
  • 如何使用 Xcode 和 Git 处理不同的库搜索路径?

    我正在和朋友一起开发一个应用程序 我们使用 git 私有 作为版本控制系统 我们面临的问题是 Xcode 5 1 DP2 给出此警告 Apple Mach O 链接器警告 未找到目录 出现此警告的原因是 Xcode 在我的硬盘上找不到我朋友
  • 在原则 2 中指定表类型/存储引擎

    那么如何在原则 2 中指定用于给定实体的存储引擎呢 我正在创建一个需要全文索引的表 并且只有 MyISAM 存储引擎支持 MySQL 中的全文索引 另一方面 看起来 Doctrine 2 不支持开箱即用的全文索引 也没有全文搜索 那是对的吗
  • ColdFusion 变量竞争条件?

    我需要一些帮助来确定为什么这个特定的代码在极少数情况下会产生竞争条件 我找到了一个解决方案 我也会概述它 但我真的很想理解它 我们有一个基于 CMS 的系统 由许多松散地基于保险丝盒模型的模块组成 一切都通过单个index cfm 运行 在
  • 为 docker 容器提供可路由的 IP 地址

    我在 ubuntu 14 04 上运行它并且已经设置docker0到静态 IP 然后通过防火墙从公共 IP 路由到该静态 IP 我正在尝试将后端 API 设置为在 docker 容器中运行 但对一些事情感到困惑 1 我将如何映射docker
  • 了解 C++ 中随机数生成器的种子是什么

    我有一个非托管 C 控制台应用程序 其中使用 srand 和 rand 我不需要这个来解决特定问题 但很好奇 传递给 srand 的原始种子是否存储在我可以查询的内存中的某个位置 有什么办法可以知道种子是什么吗 不需要存储种子 只需要存储最
  • Vuetify 中的颜色主题更改不起作用

    我将 vuejs 与 vuetify 一起使用 我放置了基本 vuetify 模板并尝试更改颜色主题 但颜色不会切换 我的控制台中没有出现任何错误 并且我的缓存也被清除 main js代码 import Vue from vue impor
  • VM 快照期间 BizTalk 与 SQL 的连接问题

    我们有一个用于 BizTalk 的虚拟机和一个用于 SQL 后端的单独虚拟机 我们使用 Veeam 进行备份 这基本上会启动虚拟机的快照 当此快照在 SQL VM 上最终确定时 应用程序服务器上的 BizTalk 服务将失败 通常它们会自动
  • 检测是否开启“蓝牙扫描”定位

    从 Android M 开始 如果您启用了蓝牙设备 即使全球定位已关闭 也可以在后台扫描蓝牙设备 蓝牙扫描位置设置中的选项 参见屏幕截图 为了扫描 BLE 设备 必须满足以下条件 COARSE LOCATION or FINE LOCATI
  • 使用 C# 将布尔数组转换为字符串

    我有一个看起来像这样的数组 status 0 true status 1 true status 2 false status 3 true 实际上它更大 但仍然小于 20 我需要将其转换为 ABD 其中每个 true 代表字母表中的一个有
  • 使用芯片输入选择不显示所选值

    我有一个选择 输入采用芯片格式 我尝试了所选值的控制台日志 效果很好 但由于某种原因 它没有显示在选择框中 我在这里做错了什么 handleChange event gt this setState badge event target v
  • Spring Boot中事务同步与Database+kafka示例

    我想使用 Spring boot 编写一个新应用程序 使用 MySQL Mango 数据库和 Spring Kafka 进行消息传递 我尝试使用 Many POC 来同步 Kafka 和 DB 之间的事务 但在某些情况下失败了 并且我还搜索
  • 如何访问 CGContext 以在屏幕外创建 CGLayer

    意图 创造CGLayer在屏幕外 从第二个线程在其上绘制一些复杂的东西 稍后使用它在主线程上快速绘制 Problem CGLayerCreateWithContext context size info 期望已经存在的CGContext这样
  • 如何在 ASP.net IIS 7.5 中利用浏览器缓存

    以下可缓存资源的新鲜生命周期较短 指定以下资源至少在未来一周内到期 http pagespeed googlelabs com http pagespeed googlelabs com建议我将此作为我的网站的高度优先事项 我正在使用 Wi
  • 用于 GUI 的 Java 2D 场景图形库

    我正在寻找用于构建 GUI 应用程序的 2D 场景图形库 它应该很快 使用 Java2D 并与 Swing 兼容 可嵌入 Swing 应用程序并显示 Swing 组件 对动画的支持是一个优点 您有使用某些图书馆的经验吗 有没有我错过的图书馆
  • Numpy 图像数组:如何有效地从 RGB 切换到 Hex

    我一直在使用嵌套 for 循环将 RGB 图像转换为十六进制值的图像数组 但对于大图像来说太慢了 有谁知道可以帮助我从 RGB 切换回 HEX 的快速方法和 或库 编辑 ragingSloth 这是我想出的 但对于我的需要来说太慢了 def
  • 如何在 Travis CI 上安装某些东西而不超时?

    我正在尝试测试 travis ci org 上构建的包 但 pip install scipy 遇到超时 Installing collected packages scipy Running setup py install for sc
  • 如何从 Excel 单元格获取完整值,而不是显示的(四舍五入)值?

    我在从工作表的单元格检索确切值时遇到问题 如果我打开文件 单元格有一个十进制数 仅显示 4 位小数 但如果我单击特定单元格 则该值会不同 有 6 位小数 我知道这是应用于单元格的设置 以便仅显示 4 位小数 现在我尝试使用 ClosedXM