2016-04-07 11 views
0

Derzeit habe ich eine Excel-Datei mit 1500 Zeilen und 9 Spalten. Jedes Mal, wenn mein winform lädt, möchte ich, dass die Datensätze in der Excel-Datei in eine Datagridview geladen werden. Ich verwendete Microsoft Office Interop, um die Datensätze in Datagridview zu importieren, aber es ist zu langsam.So importieren Sie Excel zu Datagridview schneller mit vb.net

Also meine Frage ist, auf welche andere Weise kann ich den Prozess beschleunigen? und wie kann ich das machen?

Dim xlApp As Microsoft.Office.Interop.Excel.Application 
Dim xlWorkBook As Microsoft.Office.Interop.Excel.Workbook 
Dim xlWorkSheet As Microsoft.Office.Interop.Excel.Worksheet 

xlApp = New Microsoft.Office.Interop.Excel.Application 
xlWorkBook = xlApp.Workbooks.Open("C:\Install\Data.xlsx") 
xlWorkSheet = xlWorkBook.Sheets("sheet1") 

Dim countRows As Integer = xlWorkSheet.UsedRange.Rows.Count() 

For i As Integer = 2 To countRows 
    newVersionRow = VersionDBDataSet.IEVersion.NewIEVersionRow() 
    newVersionRow.PC_Name = xlWorkSheet.Cells(i, 1).value.ToString() 
    newVersionRow.PC_Status = xlWorkSheet.Cells(i, 2).value.ToString() 
    newVersionRow.svcKBNumber = xlWorkSheet.Cells(i, 3).value.ToString() 
    newVersionRow.svcVersion = xlWorkSheet.Cells(i, 4).value.ToString() 
    newVersionRow.Last_Updated = DateTime.Parse(xlWorkSheet.Cells(i, 5).value.ToString()) 
    newVersionRow.Patches = Integer.Parse(xlWorkSheet.Cells(i, 6).value) 
    newVersionRow.Uptime = Integer.Parse(xlWorkSheet.Cells(i, 7).value) 
    newVersionRow.Count = Integer.Parse(xlWorkSheet.Cells(i, 8).value) 
    newVersionRow.Offline = Integer.Parse(xlWorkSheet.Cells(i, 9).value) 

    VersionDBDataSet.IEVersion.Rows.Add(newVersionRow) 

    If newVersionRow.PC_Status = "Online" Then 
     numofOnline += 1 
     lblOnlinePC.Text = numofOnline 
    Else 
     numofOffline += 1 
     lblOfflinePC.Text = numofOffline 
    End If 

Next 

xlWorkBook.Close() 
xlApp.Quit() 

releaseObject(xlApp) 
releaseObject(xlWorkBook) 
releaseObject(xlWorkSheet) 
+0

Veröffentlichen Sie den Code, wie Sie es gerade tun – Dan

+0

@Dan in Ordnung, ich habe den Code –

+0

Haben Sie versucht, mit 'OleDbDataReader'? – rheitzman

Antwort

0

Eine Möglichkeit ist es, alle verwendeten Zellen in einem Array zu lesen, wobei die Anordnung durchlaufen und Zellendaten in Reihen einer Datentabelle zu platzieren. Das Folgende ist eingerichtet, um drei Datenspalten zu lesen. Wenn es mehr Spalten im Blatt gibt, ignorieren wir sie in dieser Demo. Erstellen Sie also neun Datenspalten und verwenden Sie dieselbe Logik.

Beachten Sie das letzte Argument für die Funktion HasHeader, wenn es als True übergeben wird, wird die erste Zeile im Array als Spaltennamen betrachtet und die Übergabe von False zeigt Daten in der ersten Zeile an. Der Code geht davon aus, dass wir höchstwahrscheinlich bei der ersten Zeile beginnen, aber selbst wenn wir bei Zeile 4 beginnen und Spaltenüberschriften in Zeile vier haben, kann dies ein Problem sein, da die Zeilen darüber ebenfalls gesammelt werden und wegwerfen würden die Magie hier ist also vielleicht nicht richtig für dich.

EDIT: Gerade sah Sie Ihre Frage mit Code aktualisiert, kann das folgende nicht akzeptabel sein, da es scheint, Sie beginnen nicht von der ersten Zeile, aber Sie könnten die ersten paar Elemente im Array zu überspringen, was Sie wollen .

Verwendungsbeispiel

Dim fileName As String = IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Customers.xlsx") 
Dim sheetName As String = "Customers" 
Dim dtCustomers As DataTable = UsedRowsToDataTable(fileName, sheetName, True) 
DataGridView1.DataSource = dtCustomers 

-Code Daten in Datatable

Option Strict On 
Option Infer Off 

Imports Excel = Microsoft.Office.Interop.Excel 
Imports Microsoft.Office 
Imports System.Runtime.InteropServices 
Module ExcelIterataingData_DataTable 
    Public Function UsedRowsToDataTable(
     ByVal FileName As String, 
     ByVal SheetName As String, 
     ByVal HasHeader As Boolean) As DataTable 

     Dim dtSheetData As New DataTable 

     If IO.File.Exists(FileName) Then 

      Dim Proceed As Boolean = False 
      Dim xlApp As Excel.Application = Nothing 
      Dim xlWorkBooks As Excel.Workbooks = Nothing 
      Dim xlWorkBook As Excel.Workbook = Nothing 
      Dim xlWorkSheet As Excel.Worksheet = Nothing 
      Dim xlWorkSheets As Excel.Sheets = Nothing 
      Dim xlCells As Excel.Range = Nothing 

      xlApp = New Excel.Application 
      xlApp.DisplayAlerts = False 
      xlWorkBooks = xlApp.Workbooks 
      xlWorkBook = xlWorkBooks.Open(FileName) 

      xlApp.Visible = False 

      xlWorkSheets = xlWorkBook.Sheets 

      For x As Integer = 1 To xlWorkSheets.Count 
       xlWorkSheet = CType(xlWorkSheets(x), Excel.Worksheet) 

       If xlWorkSheet.Name = SheetName Then 
        Proceed = True 
        Exit For 
       End If 

       Marshal.FinalReleaseComObject(xlWorkSheet) 
       xlWorkSheet = Nothing 

      Next 
      If Proceed Then 

       dtSheetData.Columns.AddRange(
        New DataColumn() _ 
        { 
         New DataColumn With 
         { 
          .ColumnName = "CompanyName", 
          .DataType = GetType(String) 
         }, 
         New DataColumn With 
         { 
          .ColumnName = "ContactName", 
          .DataType = GetType(String) 
         }, 
         New DataColumn With 
         { 
          .ColumnName = "ContactTitle", 
          .DataType = GetType(String) 
         } 
        } 
       ) 

       Dim xlUsedRange As Excel.Range = xlWorkSheet.UsedRange 

       Try 

        Dim ExcelCells(,) As Object = 
         CType(xlUsedRange.Value(
           Excel.XlRangeValueDataType.xlRangeValueDefault), 
          Object(,)) 

        If ExcelCells IsNot Nothing Then 
         ' Get bounds of the array. 
         Dim RowCount As Integer = ExcelCells.GetUpperBound(0) 

         For row As Integer = 1 To RowCount 

          If (ExcelCells(row, 1) IsNot Nothing) AndAlso (ExcelCells(row, 2) IsNot Nothing) Then 
           dtSheetData.Rows.Add(New Object() _ 
            { 
             ExcelCells(row, 1), 
             ExcelCells(row, 2), 
             ExcelCells(row, 3) 
            } 
           ) 
          End If 
         Next 

        End If 
       Finally 
        Release(xlUsedRange) 
       End Try 

      End If 

      xlWorkBook.Close() 
      xlApp.UserControl = True 
      xlApp.Quit() 

      Release(xlCells) 
      Release(xlWorkSheets) 
      Release(xlWorkSheet) 
      Release(xlWorkBook) 
      Release(xlWorkBooks) 
      Release(xlApp) 

      If Not Proceed Then 
       Throw New Exception("Failed to locate " & SheetName) 
      End If 
     Else 
      Throw New Exception("Failed to locate " & FileName) 
     End If 

     If HasHeader Then 
      If dtSheetData.Rows.Count > 0 Then 
       dtSheetData.Rows(0).Delete() 
      End If 
     End If 

     Return dtSheetData 

    End Function 
    Private Sub Release(ByVal sender As Object) 
     Try 
      If sender IsNot Nothing Then 
       Marshal.ReleaseComObject(sender) 
       sender = Nothing 
      End If 
     Catch ex As Exception 
      sender = Nothing 
     End Try 
    End Sub 

End Module 

eine weitere Option zu lesen ist über OleDb Datenprovider zu lesen waren Sie Beispiele in einem MSDN code samples here finden Projekt sehen Demo1_VB für ein einfaches Beispiel, während die anderen ein bisschen komplexer sind.

Verwandte Themen