从excel文件读取时CPU使用率是否达到100%?

时间:2012-04-05 12:02:47

标签: windows vb.net excel

我创建了一个VB.Net应用程序,它将从excel文件读取并将数据放入表中。 我使用了一张excel表,它有3列和65000行。 在开始阅读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
提前thx。

3 个答案:

答案 0 :(得分:4)

这是完全正常的。只有的程序才会在I / O陷入困境时烧掉100%的核心。从磁盘或网卡读取,在操作系统提供数据时阻止程序。你的代码不会像那样陷入困境,你要求它做一堆工作。逐个获得195,000个单元格值只需要一段时间。 Excel是一个进程外COM服务器,因此每个单元读取都需要两个CPU上下文切换。您可以使用Range来优化它。或者在具有双核CPU的机器上运行它,因此它最多只能射击50%。

功能,而不是错误。

答案 1 :(得分:3)

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

答案 2 :(得分:1)

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

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

在调整代码以按行,逐列读取单元格值时,请继续监视CPU使用情况,或者一次性获取所有单元格值。