Vb.net interop.excel将范围对象(,)转换为双(,)

Vb.net interop.excel将范围对象(,)转换为双(,),vb.net,excel-interop,Vb.net,Excel Interop,我获得了一个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(

我获得了一个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[,]”

有没有一种简单的方法可以从电子表格中以双精度数组的形式获取数据?我可以循环数组中的每个元素,但这似乎不是必需的

这是一个C#示例,但您在将其转换为vb时应该不会遇到问题

object[,] arrWks = (object[,])enuWorksheet.UsedRange.get_Value(XLS.XlRangeValueDataType.xlRangeValueDefault);
因此,在您的案例中,不要使用
.Value
,而是使用
get\u Value
方法

然后,在遍历数组时,请记住检查空值:

object objKom = arrWks[intRow, intCol];
string strKom = objKom == null ? "" : objKom.ToString();
希望这有帮助。

使用
Array.Copy()

顺便说一句,我把
convert 2d object 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)

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