【问题标题】:interop.excel convert Range Object(,) to Double(,)interop.excel 将 Range Object(,) 转换为 Double(,)
【发布时间】:2013-12-05 16:12:23
【问题描述】:

我得到了一个Microsoft.Office.Interop.Excel.Range对象,如图:

Dim maxRow As Integer = currentSheet.UsedRange.Rows.Count
currentSheet.Range("A2").Resize(maxRow-1, 2).Value

我正在尝试将其转换为二维双精度数组,但如果我这样做:

Dim arrayData(,) As Double = currentSheet.Range("A2").Resize(maxRow - 1, 2).Value

我收到以下错误:

附加信息:无法转换类型的对象 'System.Object[,]' 输入 'System.Double[,]'。

有没有一种简单的方法可以从电子表格中以双精度数组的形式获取数据?我可以遍历数组中的每个元素,但似乎没有必要这样做。

【问题讨论】:

    标签: vb.net excel-interop


    【解决方案1】:

    使用Array.Copy()

    Dim arrayData(,) As Double
    Dim objData(,) As Object = currentSheet.Range("A2").Resize(maxRow - 1, 2).Value
    Array.Copy(objData, arrayData, objData.Length)
    

    顺便说一句,我是通过将convert 2d object double 放入搜索引擎中找到的... How can I quickly up-cast object[,] into double[,]?

    编辑

    我刚刚在自己的 Excel 工作表上尝试过,它可以工作。我应该添加的一件事是,我需要在标注目标数组时指定它的边界。

    'Dim objData(,) As Object = xlSheet.Range("C6:E14").Value ' either way works
    Dim objData(,) As Object = xlSheet.Range("C6").Resize(9, 3).Value
    Dim dblData(objData.GetUpperBound(0) - 1, objData.GetUpperBound(1) - 1) As Double
    Array.Copy(objData, dblData, objData.Length)
    

    您能否在运行时检查您的Object(,) 以确保其中有数据?此外,所有内容都需要转换为Double

    【讨论】:

    • 好吧,显然你比我更擅长搜索,因为我花了至少 4 个小时没有找到任何真正有用的东西。
    • 经过进一步调查,我发现虽然这会编译,但它不会按预期复制数据。数组末尾的许多值不应该为 0。事实上,我能找到的唯一正确的值是 arrayData(0,0) 和 arrayData(0,1)。
    • 我正在指定我的目标数组的边界,并且我已经验证我的所有数据都可以转换为 Double。我已经通过使用嵌套的 for 循环和Double.Parse() 成功地将数据复制到一个二维数组中,但是由于某种原因,当切换回这种方法时,我仍然有一些单元格填充了“0”而不是实际值,并且其余的(前两个除外)都是错误的。我的 Object 数组显然是 1 索引,而我的 Double 数组是 0 索引,这会导致问题吗?
    • 也许你有一些隐藏的单元格?否则我不知道,对不起。
    • 我想我还是会使用嵌套循环,因为现在我想对每个元素进行一些计算
    【解决方案2】:

    这是一个 C# 示例,但将其转换为 vb 应该没有问题。

    object[,] arrWks = (object[,])enuWorksheet.UsedRange.get_Value(XLS.XlRangeValueDataType.xlRangeValueDefault);
    

    所以在你的情况下,不要使用.Value,而是使用get_Value 方法。

    那么在遍历数组的时候,记得检查空值:

    object objKom = arrWks[intRow, intCol];
    string strKom = objKom == null ? "" : objKom.ToString();
    

    希望这会有所帮助。

    【讨论】:

    • but you shouldn't have problems converting it to vb - 那么你也不应该这样做。
    猜你喜欢
    • 2013-04-15
    • 2011-07-02
    • 1970-01-01
    • 2021-05-19
    • 2022-10-22
    • 2023-01-23
    • 1970-01-01
    • 2023-04-01
    • 2016-10-10
    相关资源
    最近更新 更多