2012-04-05 212 views
1

我創建了一個VB.Net應用程序,它將從excel文件中讀取並將數據放入一個表中。 我用了一個有3列和65000行的Excel表格。 在開始讀取excel之前,我的機器的CPU使用率約爲15%,但在讀取期間CPU使用率跳至95%。 我不知道它爲什麼會發生?有人可以幫我解決這個問題嗎? 以下是我寫的代碼:從excel文件讀取時CPU使用率達到100%?

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提前。

+0

你的代碼是什麼樣的? – APrough 2012-04-05 12:06:52

+0

從excel中讀取和單獨插入65k記錄只需要一些CPU電源,這就是全部... – Mr47 2012-04-05 12:18:22

+0

我嘗試了沒有插入和jus 1000行也,那時候它也會達到最大。 – 2012-04-05 12:21:13

回答

4

這是完全正常的。一個程序只有不會當I/O陷入困境時刻100%核心。從磁盤或網卡上讀取,這會在操作系統提供數據時阻止程序。你的代碼不會像這樣陷入困境,你要求它做一堆工作。逐個獲取195,000個單元值需要一段時間。 Excel是一個進程外COM服務器,因此每個單元讀取需要兩個CPU上下文切換。您可以通過使用Range來優化它。或者通過在帶有雙核CPU的機器上運行它,因此它只能拍攝高達50%。

功能,而不是一個錯誤。

3

將195000個單元一次讀入Object數組,然後循環對象數組的速度要快得多。 (每個.Net調用Excel對象模型的開銷非常高)

1

使用get_range(cell1,cell2)方法獲取單元格值。

您可以使用它逐行,逐列或單次取所有單元格的值。

當您調整代碼以逐行讀取單元格值或一次讀取所有單元格值時,請務必留意CPU使用情況。