【发布时间】:2011-09-06 16:28:08
【问题描述】:
第一次在这里提问。提前感谢您提供的任何帮助。
我正在尝试从电子表格中读取一堆数据,将其切碎,然后将其放入数据库中。我宁愿不这样做,但这是与会计类型打交道的基本现实。值得庆幸的是,这些电子表格报告非常一致。无论如何,我正在使用 LINQ for SQL 来处理对象到引用的内容,并且我正在使用 Microsoft.Office.Interop 来启动我的 Excel。
我通读了一个充满 .xls 的目录,对于每个目录,我都打开文件,从某些特定单元格中获取一些特定数据,然后获取一系列单元格来挑选值。
Private Sub ProcessAFile(ByVal f As FileInfo)
thisFile = openApp.Workbooks.Open(f.fullName)
thisMonth = Split(thisChart.Range("D6").Value, "-").Last.Trim
thisFY = thisChart.Range("L7").Value
thisWorkArea = thisChart.Range("A14", "L51").Value2
openApp.Workbooks.Close()
...
thisWorkArea 被调暗为全局:
Dim thisWorkArea As Object(,)
我在 A14 和 L51 之间的范围内同时获取字符串和整数,因此在这里将其设为对象数组是有意义的。我不想遍历每一行并在 Excel 中挑选范围,我只想阅读一次然后关闭它。
所以我得到以下异常:
System.IndexOutOfRangeException 未处理 Message=Index 超出了数组的范围。
在这个函数中:
Private Sub fillCurrMonth()
Dim theseRows As Integer() = {0, 2, 3, 5}
For Each i In theseRows
Dim thisMonth As New Month
'make sure category is in Database
thisMonth.Dept = thisDeptName
thisMonth.FY = thisFY
thisMonth.Category = thisWorkArea(i, 0)
...
上面的“月”指的是一个 LINQ 实体。没什么花哨的。
最后一行是我发现异常的地方。在我的手表中,我发现 thisWorkArea 的长度为 456 和 (0,0) -> "Inpatient"{String}
那么为什么我会得到这个异常?我把它交给你的专家。我对 vb.net 还是很陌生,所以也许我只是缺少一些基本的东西。
【问题讨论】:
-
当您调用 thisWorkArea = thisChart.Range("A14", "L51").Value2 在调试器中,在该行之后,您似乎正在将“thisWorkArea”设置为单元格的值执行时,如果将鼠标悬停在 thisWorkArea 上,会出现什么? Option Strict 是否开启?
-
在调试器中,当我将鼠标悬停在 thisWorkArea 上时,会弹出一个工具提示,名称旁边是 {Length=456}。如果我单击加号,它会给我电子表格的预期值及其坐标,例如(0,0) “住院病人”。我不熟悉“Option Strict On”,但会明白这意味着什么。
-
我打开了 Option Strict,确保所有内容都按照应输入的方式输入,我在这里遇到了完全相同的错误。不过,很高兴获得另一个 vb 提示 - 感谢 Chris Dunaway。
-
我从工作人员那里得知,使用 Excel 填充这些数组时,Watch 报告它们具有 0 基,而实际上它们是 1 基。这非常奇怪,但我已经考虑过了,现在它可以工作了。奇怪!
标签: vb.net arrays linq-to-sql multidimensional-array excel-interop