1

第一次在这里提问。提前感谢您提供的任何帮助。

我正在尝试从电子表格中读取一堆数据,将其切碎,然后将其放入数据库中。我宁愿不这样做,但这是与会计类型打交道的基本现实。值得庆幸的是,这些电子表格报告非常一致。无论如何,我正在使用 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 还是很陌生,所以也许我只是缺少一些基本的东西。

4

2 回答 2

4

Excel 使用基于 1 的索引。这源于它使用 VB 作为应用程序内编程语言,传统上使用基于 1 的索引。

您会发现 Excel 返回了一个定义为的数组thisWorkArea(1 To 11, 1 To 37) As Object

于 2011-09-06T22:47:15.493 回答
0
        'Fix excel's 1 based index
        Dim oData(UBound(xData) - 1, UBound(xData, 2) - 1) As Object
        For i As Integer = 1 To UBound(xData)
            For ii As Integer = 1 To UBound(xData, 2)
                oData(i - 1, ii - 1) = xData(i, ii)
            Next
        Next
于 2016-09-14T17:47:54.867 回答