Excel OLEDB DataTable

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von HenryV.

    Excel OLEDB DataTable

    Eines unsere Analysengeräte kann Exporfiles der Messergebnisse erzeugen.
    Man kann sich entscheiden entweder CSV oder Excel (xlsx).

    CSV habe ich jetzt am Laufen, bin mir aber nicht sicher, ob das auf Dauer sinnvoll ist.
    Da das Programm auf einem Rechner mit teilweise amerikanischer Einstellung läuft, muss
    ich alles passend umwandeln.
    CSV ist halt sehr langsam, da ich jede Zeile einzeln bearbeite und dann in eine DataTable schiebe.
    Auf die DataTable mache ich dann meine Abfragen. Das läuft also...

    Mit Excel über einen Jet 4 Teiber hatte ich sofort Probleme, dass Daten einer bestimmten Spalte
    nicht gelesen wurden. Dieses Thema wurde hier im Forum schon mal behandelt.
    Mit einem neuen Treiber (ich kann jetzt leider hier nicht nachschauen; ACE oder so ähnlich für Excel 12)
    wird diese Spalte zumindest gelesen.
    Jedoch habe ich den seltsamen Effekt, dass beim Einlesen in mein Programm auch Excel auf dem Rechner
    anspringt, und die Daten anzeigt. Das will ich natürlich nicht.

    Hat jemand eine Idee woran das liegt, und was ich dagegen machen kann?
    Was wäre die schnellste Methode um ein CSV in eine DataTable einzulesen?
    Was meint ihr, sollte ich es beim CSV-Einlesen belassen, und mich nicht um die Excel-Möglichkeit kümmern?
    Ich nutz' für sowas EPPlus in der Version 4.5.3.3 (letzte kostenfreie OpenSource), damit klappt das einwandfrei und
    dann sowas hier: (aus der DataTable kannst ja dann weiterarbeiten)

    VB.NET-Quellcode

    1. Imports OfficeOpenXml
    2. ''' <summary> Holt Daten aus einer Excel-Datei und fügt diese in eine temporäre DT via EPPlus </summary>
    3. Public Function ExcelImportToTempDataTable(importFile As String) As DataTable
    4. Dim dtExcel As DataTable = New DataTable()
    5. dtExcel.Clear()
    6. Dim fi As FileInfo = New FileInfo(importFile)
    7. If Not fi.Exists Then Throw New Exception("Datei " & importFile & " existiert nicht!")
    8. If importFile Like "*.xls" Then
    9. importFile = ConvertXlsToXlsx(importFile) 'altes .xls-Format in aktuelles .xlsx-Format konvertieren
    10. fi = New FileInfo(importFile)
    11. End If
    12. Using xlPackage As ExcelPackage = New ExcelPackage(fi)
    13. #If False Then '"Tabelle1" als feste Blattauswahl
    14. If Not xlPackage.Workbook.Worksheets("Tabelle1") Is Nothing Then
    15. Dim worksheet As ExcelWorksheet = xlPackage.Workbook.Worksheets("Tabelle1")
    16. #Else 'Tabellenblatt vorher auswählen
    17. Dim fileName = importFile.LastRightCut("\")
    18. Dim worksheet As ExcelWorksheet = xlPackage.Workbook.Worksheets(chooseWks(xlPackage, fileName))
    19. #End If
    20. If worksheet IsNot Nothing Then
    21. Dim startCell As ExcelCellAddress = worksheet.Dimension.Start
    22. Dim endCell As ExcelCellAddress = worksheet.Dimension.[End]
    23. 'Cols
    24. For col As Integer = startCell.Column To endCell.Column
    25. Dim colText = worksheet.Cells(1, col).Text 'Headertext anstelle Nummer
    26. dtExcel.Columns.Add(colText)
    27. Next
    28. 'Rows
    29. For row As Integer = startCell.Row + 1 To endCell.Row 'Header nicht als Row werten
    30. Dim dr As DataRow = dtExcel.NewRow()
    31. Dim x As Integer = 0
    32. For col As Integer = startCell.Column To endCell.Column
    33. dr(Math.Min(System.Threading.Interlocked.Increment(x), x - 1)) = worksheet.Cells(row, col).Value
    34. Next
    35. dtExcel.Rows.Add(dr)
    36. Next
    37. Else
    38. msgExclamation("kein Tabellenblatt ausgewählt!")
    39. Return Nothing
    40. End If
    41. End Using
    42. If msgQuestionInfo("Soll die Quelldatei gelöscht werden") = DialogResult.Yes Then
    43. fi.Delete()
    44. End If
    45. Return dtExcel
    46. End Function

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

    Lightsource schrieb:

    Nur leider ist mein Arbeitgeber ziemlich strikt, was die Installation von Zusatzsoftware betrift.

    EPPlus muss nicht installiert werden, du kannst es über den NuGet-Paket-Manager deinem Projekt hinzufügen. Nicht vergessen bei der Version 4.5.3.3 auszuwählen (letzte kostenfreie OpenSource).

    Für CSV gibt es diverse Fast CSV Reader -> z.B. diesen hier: fastCSV - A Tiny, Fast, Standard Compliant CSV Reader Writer

    Das ACE eine Excel-Instanz startet, finde ich merkwürdig. Da muss etwas in deinem Code sein, dass das hervorruft.