1

我创建了一个 VB.Net 应用程序,它将从 excel 文件中读取数据并将数据放入表中。我使用了一个 3 列和 65000 行的 excel 表。在开始阅读 excel 之前,我的机器的 CPU 使用率约为 15%,但在阅读期间 CPU 使用率跃升至 95%。我不知道为什么会这样?有人可以在这个问题上帮助我吗?以下是我编写的代码:

Private Sub readFromExcel(ByVal fileName As String, ByVal sheetName As String)
    Dim connString As String = "data source=XE; user=test; password=test"
    Dim con As New OracleConnection(connString)
    Dim str1 As String
    Dim str2 As String
    Dim str3 As String
    Dim xlApp As Excel.Application
    Dim xlWorkBook As Excel.Workbook
    Dim xlWorkSheet As Excel.Worksheet
    xlApp = New Excel.ApplicationClass
    xlWorkBook = xlApp.Workbooks.Open(fileName)
    xlWorkSheet = xlWorkBook.Worksheets(sheetName)
    Dim x As Integer
    Dim y As Integer
    Dim i As Integer
    x = xlWorkSheet.Rows.Count()
    y = xlWorkSheet.Columns.Count()
    Try
        For i = 1 To x - 1
            'MsgBox(xlWorkSheet.Cells(i, 0).value)
            str1 = xlWorkSheet.Cells(i, 1).value
            str2 = xlWorkSheet.Cells(i, 2).value
            str3 = xlWorkSheet.Cells(i, 3).value
            insertData()
        Next
    Catch ex As Exception
        MsgBox(ex.Message())
    Finally
        con.Close()
        xlWorkBook.Close()
    End Try
End Sub

Private Sub insertData()
    Dim str As String
    str = "insert into test_import values('" + str1 + "'," + str2 + "," + str3 + ")"
    Dim cmd As New OracleCommand()
    cmd.CommandText = str
    cmd.Connection = con
    cmd.ExecuteNonQuery()
End Sub

提前谢谢。

4

3 回答 3

4

这是完全正常的。只有当程序被 I/O 卡住时,它才不会烧掉 100% 的内核。从磁盘或网卡读取,在操作系统提供数据时阻止程序。您的代码不会像那样陷入困境,您是在要求它做很多工作。一个一个地获取 195,000 个单元格值只需要一段时间。Excel 是一个进程外 COM 服务器,因此每次读取单元格都需要两次 CPU 上下文切换。您可以改用 Range 对其进行一些优化。或者通过在具有两核 CPU 的机器上运行它,这样它只能达到 50%。

功能,而不是错误。

于 2012-04-05T13:18:00.787 回答
3

一次将 195000 个单元读入对象数组然后循环对象数组要快得多。(对 Excel 对象模型的每个 .Net 调用都有非常高的开销)

于 2012-04-05T13:31:44.993 回答
1

使用get_range(cell1,cell2)方法获取单元格值。

您可以使用它按行、按列获取单元格值,或一次性获取所有单元格值。

当您调整代码以逐行、逐列读取单元格值或一次性获取所有单元格值时,请注意 CPU 使用率。

于 2012-04-05T13:46:32.830 回答