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.
Veröffentlichen Sie den Code, wie Sie es gerade tun – Dan
@Dan in Ordnung, ich habe den Code –
Haben Sie versucht, mit 'OleDbDataReader'? – rheitzman