【问题标题】:Is it possible to get an int from Range.Value in VSTO?是否可以从 VSTO 中的 Range.Value 获取 int?
【发布时间】:2012-07-09 00:01:01
【问题描述】:

我有一个 VSTO 插件,并且正在从 Excel 工作表中读取数据。

似乎几乎所有数字数据都被读取为double。是否有可能从Range.Value 获得int 值?

这里有一些代码来说明我的意思。

Worksheet w = (Worksheet)Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets["Sheet1"];
var value = ((Range)w.Cells[1, 1]).Value;
bool isInt = value is int;
bool isDouble = value is double;

无论我在工作表 Sheet1 中使用哪种格式,单元格 A1,isInt 总是返回 false。

我应该使用什么格式来获取int?我想也许General0 会起作用,但似乎不行。

【问题讨论】:

  • 我不认为你会得到一个 int - Excel 从不在内部将数字存储为一个 int,总是一个 double。
  • @Govert 好的,这就是我的怀疑,但我想确认一下。如果您发布答案(最好是有关该 Excel 小道消息的来源),我会接受。

标签: c# excel vsto int


【解决方案1】:

docs 调用var value = ((Range)w.Cells[1,1]).Value 时,Value 类型派生自工作表中的值类型。所以看起来您的 Excel 工作表的值格式为doubles,而不是ints。 Excel 没有“整数”格式可以转换为 C#,最好的办法是将值转换为 integer,当您读入它时。Value 类型以它在 Excel 工作表中的任何格式出现.

This article 显示 Excel 如何处理双精度浮点值。

【讨论】:

  • 对,但我的问题本质上是,“什么工作表格式会给我int?”一般,没有小数的数字,文本,会计都给我双打。我错过了什么还是没有这种格式?
  • 啊,做一点研究表明,看起来数字在 Excel 中总是以双精度形式存储的。您可以在工作表中创建一个 看起来 像 int 的自定义格式,但是当您从 C# 查询值时,它们将作为双精度值返回。如果你这样做,虽然你可以保证值(作为双精度数)真的是整数,那么你可以只转换为 int。
  • 知道了。您能否提供有关仅双打存储在 Excel 中的来源?
  • @root45 我找不到具体说明的来源,我编辑了我的答案,其中讨论了它们的存储方式,但是暗示就在那里。实际上它不是“双精度数”,而是 Excel 有它所谓的“数字”,它将数字存储在双精度浮点值中。
【解决方案2】:

Range.Value 返回的数值是双精度值(可能是因为它们在 Excel 中都存储为双精度值,所以看起来像整数的数字是格式化的结果)

我通过 GetValue 看到的唯一整数是错误的 ErrorCodes

例如

  • DIV/0!是一个 Int32,值为 -2146826281

【讨论】:

    【解决方案3】:

    Govert 说 Excel 从不将数字存储为整数是正确的。

    Excel 将数值存储为 Double Precision Floating Point 数字,或者您知道的简称为 Doubles

    Doubles 是 8 字节变量,可以存储精确到小数点后 15 位的数字。

    编辑

    由于您正在寻找链接,请参阅此

    链接:http://support.microsoft.com/kb/78113

    【讨论】:

      【解决方案4】:

      我很确定 Excel 中的所有数字都是双精度数。例如,以下 VBA 代码将单元格值设置为长整数 (Int32),然后将其读回。

      Dim n As Long
      n = 123
      Range("A1").Value = n
      Debug.Print VarType(n)
      
      Dim v As Variant
      v = Range("A1").Value
      Debug.Print VarType(v)
      
      • 输入是 VarType(n) = 3 = vbLong (Int32)
      • 输出是 VarType(v) = 5 = vbDouble

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-22
        • 2010-12-07
        • 2020-12-16
        相关资源
        最近更新 更多