Daten aus Excel in ein Datagridview zu importieren funktioniert nur, wenn die Excel Tabelle auch gleichzeitig in Excel geöffnet ist.

  • VB.NET

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von tragl.

    Daten aus Excel in ein Datagridview zu importieren funktioniert nur, wenn die Excel Tabelle auch gleichzeitig in Excel geöffnet ist.

    Hallo zusammen
    Ich habe den Code aus dem untenstehenden Link benutzt um Daten aus einem Excel File in ein VB DatagridView zu importieren.
    Das funktioniert prächtig. Danke dafür.
    Aber bei mir leider nur, wenn die Tabelle auch gleichzeitig in Excel geöffnet ist. Ist die Tabelle in Excel nicht geöffnet, kommt die Catch ex As Exception Meldung.
    Ich habe alle Sorten von Import commands versucht, die bleiben aber unbenutzt (ausgegraut)
    Ich habe auch versucht, ob es etwas mit den verschiedenen Excel Versionen (Extended Properties=Excel 8.0) zu tun hat, das ändert aber nur zum negativen.
    Der Fehler ist auf 2 PC's gleich, einer mit Office 365, der andere mit Office 2013.

    Danke für einen Tip.
    TomTom

    [url='https://www.vb-paradise.de/index.php/Thread/17496-exceltabelle-in-datagridview-importieren/']Exceltabelle in Datagridview importieren
    [/url]

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „tomtom1000“ ()

    tomtom1000 schrieb:

    kommt die Catch ex As Exception Meidung
    Sowas gibt es nicht. Catch ex As Exception ist ein VB.NET-Codekonstrukt als Teil des Try-Catch-Blocks. Die tatsächliche Meldung im Wortlaut ist relevant.

    Bei mir geht das ohne Öffnen der Datei. Ich habe aber Excel 2019 und musste daher folgenden ConnectionString verwenden:

    VB.NET-Quellcode

    1. strConnection = New System.Data.OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=MeinExcelDateipfad;Extended Properties='Excel 12.0 Xml;HDR=YES';")
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Wenn du magst zeig' ich dir gerne den etwas umständlicheren Weg mit EPPlus... dann ist es egal welche Excel-Version und ob überhaupt Excel installiert ist.
    Edit: Ich hatte VS doch noch offen...

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Data.OleDb, System.Runtime.CompilerServices, System.Diagnostics, System.IO
    2. Imports OfficeOpenXml
    3. Public Module Office
    4. ''' <summary> Holt Daten aus einer Excel-Datei und fügt diese in eine temporäre DT via EPPlus </summary>
    5. Public Function ExcelImportToTempDataTable(importFile As String) As DataTable
    6. Dim dtExcel As DataTable = New DataTable()
    7. dtExcel.Clear()
    8. Dim fi As FileInfo = New FileInfo(importFile)
    9. If Not fi.Exists Then Throw New Exception("Datei " & importFile & " existiert nicht!")
    10. Using xlPackage As ExcelPackage = New ExcelPackage(fi)
    11. #If False Then '"Tabelle1" als feste Blattauswahl
    12. If Not xlPackage.Workbook.Worksheets("Tabelle1") Is Nothing Then
    13. Dim worksheet As ExcelWorksheet = xlPackage.Workbook.Worksheets("Tabelle1")
    14. #Else 'Tabellenblatt vorher auswählen
    15. Dim fileName = importFile.LastRightCut("\")
    16. Dim worksheet As ExcelWorksheet = xlPackage.Workbook.Worksheets(chooseWks(xlPackage, fileName))
    17. #End If
    18. If worksheet IsNot Nothing Then
    19. Dim startCell As ExcelCellAddress = worksheet.Dimension.Start
    20. Dim endCell As ExcelCellAddress = worksheet.Dimension.[End]
    21. 'Cols
    22. For col As Integer = startCell.Column To endCell.Column
    23. Dim colText = worksheet.Cells(1, col).Text 'Headertext anstelle Nummer
    24. dtExcel.Columns.Add(colText)
    25. Next
    26. 'Rows
    27. For row As Integer = startCell.Row + 1 To endCell.Row 'Header nicht als Row werten
    28. Dim dr As DataRow = dtExcel.NewRow()
    29. Dim x As Integer = 0
    30. For col As Integer = startCell.Column To endCell.Column
    31. dr(Math.Min(System.Threading.Interlocked.Increment(x), x - 1)) = worksheet.Cells(row, col).Value
    32. Next
    33. dtExcel.Rows.Add(dr)
    34. Next
    35. Else
    36. msgExclamation("kein Tabellenblatt ausgewählt!")
    37. End If
    38. End Using
    39. If msgQuestionInfo("Soll die Quelldatei gelöscht werden") = DialogResult.Yes Then
    40. fi.Delete()
    41. End If
    42. Return dtExcel
    43. End Function
    44. ''' <summary> Dient zur Auswahl des richtigen Tabellenblattes </summary>
    45. Private Function chooseWks(xlPackage As ExcelPackage, Filename As String) As String
    46. Dim usedWks As String = ""
    47. Using dlg As New dlgListboxAuswahl
    48. dlg.Text = $"Tabellenblatt für Datei {Filename} auswählen..."
    49. For Each wks As ExcelWorksheet In xlPackage.Workbook.Worksheets
    50. dlg.lbAuswahl.Items.Add(wks.Name)
    51. Next
    52. If dlg.ShowDialog = DialogResult.OK Then
    53. If Not dlg.lbAuswahl.SelectedItem Is Nothing Then
    54. usedWks = dlg.lbAuswahl.SelectedItem.ToString
    55. Else
    56. usedWks = Nothing
    57. End If
    58. End If
    59. End Using
    60. Return usedWks
    61. End Function
    62. End Module


    Dein DGV kannst du dann wie folgt "befüllen"
    dgv.Datasource = ExcelImportToTempDataTable(importFile)
    Die ImportFile sollte natürlich vorher bekannt sein - ich mach' das mit:

    Dim importFile = openFile("Excel-Dateien (*.xlsx)|*.xlsx")

    VB.NET-Quellcode

    1. ''' <summary> Datei öffnen-Dialog </summary>
    2. Public Function openFile(Filter As String) As String
    3. Using fiDlg As New OpenFileDialog
    4. fiDlg.Filter = Filter
    5. If fiDlg.ShowDialog = DialogResult.OK Then
    6. Return fiDlg.FileName
    7. Else
    8. msgError("Es wurde keine Datei ausgewählt!")
    9. Return ""
    10. End If
    11. End Using
    12. End Function


    EPPlus bekommst du über NuGet. Achtung: Hier musst du auf die Version aufpassen, die haben ab einer bestimmten Version das Lizenzmodell geändert.
    Ich nutze Version v4.5.3.3 - die kannst überall verwenden.


    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „tragl“ ()