Export aus Access zu Excel

  • VB.NET
  • .NET (FX) 4.0

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    Export aus Access zu Excel

    Hi zusammen,

    ich möchte über einen Quellcode-Befehl eine bestimmte Tabelle aus eine AccessDB in Excel exportieren und ausgeben lassen. Das Ganze Soll über einen Button geschehen.
    Ich hatte mir dazu folgende Schritte überlegt.
    Buttonklick
    - Verbindung zu Datenbank aufbauen
    - Prüfen ob richtige Tabelle vorhanden, wenn nicht Fehlermeldung
    - Tabelle aufrufen
    - Werte auslesen
    - Excel Dokument erzeugen
    - Werte in Zellen schreiben
    - Excel-Tabelle Speicherort aussuchen
    - Excel-Tabelle abspeichern
    - DB schließen
    - Verbindung beenden

    Wäre super, wenn mir jemand dazu weiterhelfen könnte.

    Viele Grüße
    Reicht es nicht einfach den Export in der Access-Datenbank zu "speichern" und dann nurnoch extern anzustoßen? Wenn es denn zwingend extern sein muss.
    Dann wäre auch Formatierung usw. alles beachtet.

    Ich hab gerade keinen Code für das Exportieren, sondern nur für das Importieren. Sollte aber mit kleinen Änderungen in paar Minuten umgesetzt sein.

    VB.NET-Quellcode

    1. Public Sub ImportCsv(ByVal CsvPath As String, ByVal DatabasePath As String,
    2. ByVal TableName As String, Optional ByVal HasFieldNames As Boolean = False)
    3. Dim Schema() As String
    4. Schema = TableName.Split("_")
    5. Dim accApp As New Microsoft.Office.Interop.Access.Application
    6. With accApp
    7. .OpenCurrentDatabase(DatabasePath)
    8. .DoCmd.TransferText(Microsoft.Office.Interop.Access.AcTextTransferType.acImportDelim, Schema(0) & "_" & Schema(1) & "_Import", TableName, CsvPath, HasFieldNames)
    9. .CloseCurrentDatabase()
    10. .Quit()
    11. End With
    12. accApp = Nothing
    13. End Sub


    Schema müsstest natürlich auch noch anpassen. Das Schema wäre der Name unter dem du den Export in der Datenbank gespeichert hast.
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D

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

    Klingt auch gut.
    Bin nur nicht so der Freund mit Excel-Fernsteuern. So ne Übertragung zwischen Excel und Access sollte aber vom Framework irgendwo abgefrühstückt werden. Sind ja alle aus gleichem Haus.

    EDIT:
    Gibt sogar fertige Snippets von Microsoft:
    support.microsoft.com/de-de/kb/306022
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    Danke euch schonmal für die Rückmeldung. Ich möchte das von einer "Maske" aus exportieren. das bedeutet ich habe eine frm auf der sich der Button für den Export befindet und möchte nicht, dass man erst excel oder access manuell öffnet und den export ausführt, sondern dass eine export funktion in meinem programm fest als Button hinterlegt ist.
    Muss man doch für beides nicht
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    In dem von mir verlinkten Beitrag sind doch alle Möglichkeiten MIT Quellcode erklärt.
    Zudem eine vollständige Beispiellösung.
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    Ja stimmt schon, allerdings komme ich da nicht so ganz zurecht. Ich weiß nicht genau welchen von den Codes ich da wählen soll. Aber das kann ja nicht sooo schwer sein eine Access Tabelle auszulesen und in ein neues Excel-Dokument zu übertragen.
    Also nen fertigen Code der genau tut was du möchtest, wird dir keiner hier so geben.
    Wenn du Fragen zu den Codebeispielen hast, dann stell die einfach und wir kriegen schon ne lauffähige Lösung hin.
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    Ok.. das wäre zu einfach .D also ich habe die Verbindung als "conn" zur Datenbank hergestellt im Public Class. Wie wähle ich eine spezielle Tabelle in der Datenbank an? vllt ist es so detaillierter.:) das Erzeugen des Excel-Dokumentes selbst ist ja gut beschrieben in den links.
    Welches der Snippets verwendest du?
    Wie ist der aktuelle Code?
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    Imports Microsoft.Office.Core
    Imports Excel = Microsoft.Office.Interop.Excel

    Public Class frmManagement

    Public conn As New System.Data.OleDb.OleDbConnection()
    Public cmd As New OleDb.OleDbCommand
    Public dbPfad As String = "Pfad"

    Public Sub connection()

    conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data source=" & dbPfad
    Try
    conn.Open()
    Catch ex As Exception
    MessageBox.Show("Datenbank nicht erreichbar")
    frmStart.Enabled = True
    Me.Close()
    End Try
    End Sub
    Public Sub disconnection()
    conn.Close()
    End Sub

    Private Sub btnExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExit.Click
    frmStart.Enabled = True
    disconnection()
    Me.Close()
    End Sub

    Private Sub frmManagement_Leave(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.FormClosing
    frmStart.Enabled = True
    disconnection()
    End Sub

    Private Sub frmManagement_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    connection()
    End Sub

    Private Sub btnPreisanpassung_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPreisanpassung.Click
    frmPreis.Show()
    Me.Enabled = False
    End Sub

    Private Sub btnAuswertung_Click(sender As Object, e As EventArgs) Handles btnAuswertung.Click
    frmGraph.Show()
    Me.Enabled = False
    End Sub

    Private Sub btnExport_Click(sender As System.Object, e As System.EventArgs) Handles btnExport.Click
    'Create a Recordset from all the records in the Orders table.

    Dim rs As ADODB.Recordset
    conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data source=" & dbPfad
    Try
    conn.Open()
    Catch ex As Exception
    MessageBox.Show("Datenbank nicht erreichbar")
    frmStart.Enabled = True
    Me.Close()
    End Try
    conn.CursorLocation = ADODB.CursorLocationEnum.adUseClient
    rs = conn.Execute("angenommen", , ADODB.CommandTypeEnum.adCmdTable)

    'Create a new workbook in Excel.
    Dim oExcel As Object
    Dim oBook As Object
    Dim oSheet As Object
    oExcel = CreateObject("Excel.Application")
    oBook = oExcel.Workbooks.Add
    oSheet = oBook.Worksheets(1)

    'Transfer the field names to Row 1 of the worksheet:
    'Note: CopyFromRecordset copies only the data and not the field
    ' names, so you can transfer the fieldnames by traversing the
    ' fields collection.
    Dim n As Int32
    For n = 1 To rs.Fields.Count
    oSheet.Cells(1, n).Value = rs.Fields(n - 1).Name
    Next

    'Transfer the data to Excel.
    oSheet.Range("A2").CopyFromRecordset(rs)

    'Save the workbook and quit Excel.
    oBook.SaveAs(sSampleFolder() & "Book3.xlsx")
    oSheet = Nothing
    oBook = Nothing
    oExcel.Quit()
    oExcel = Nothing
    GC.Collect()

    'Close the connection
    rs.Close()
    conn.Close()

    End Sub

    Private Function sSampleFolder() As String
    Throw New NotImplementedException
    End Function

    End Class

    Letzteres ist der Code (etwas umgewandelt aus dem MS support)

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

    Also so allgemein zum Forum und Codes ^^
    Man kann hier einen "VB.Net"-Tag benutzen, der deinen Code ordentlich formatiert wie in Visual Studio. Sodass man ihn als Helfender auch lesen kann.
    Für lange Codes gibts auch die Expander, die den Code nur zeigen wenn ihn auch wer anschauen will. Der Übersichtlichkeithalber.
    Ich denke es geht dir um:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub btnExport_Click(sender As System.Object, e As System.EventArgs) Handles btnExport.Click
    2. 'Create a Recordset from all the records in the Orders table.
    3. Dim rs As ADODB.Recordset
    4. conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data source=" & dbPfad
    5. Try
    6. conn.Open()
    7. Catch ex As Exception
    8. MessageBox.Show("Datenbank nicht erreichbar")
    9. frmStart.Enabled = True
    10. Me.Close()
    11. End Try
    12. conn.CursorLocation = ADODB.CursorLocationEnum.adUseClient
    13. rs = conn.Execute("angenommen", , ADODB.CommandTypeEnum.adCmdTable)
    14. 'Create a new workbook in Excel.
    15. Dim oExcel As Object
    16. Dim oBook As Object
    17. Dim oSheet As Object
    18. oExcel = CreateObject("Excel.Application")
    19. oBook = oExcel.Workbooks.Add
    20. oSheet = oBook.Worksheets(1)
    21. 'Transfer the field names to Row 1 of the worksheet:
    22. 'Note: CopyFromRecordset copies only the data and not the field
    23. ' names, so you can transfer the fieldnames by traversing the
    24. ' fields collection.
    25. Dim n As Int32
    26. For n = 1 To rs.Fields.Count
    27. oSheet.Cells(1, n).Value = rs.Fields(n - 1).Name
    28. Next
    29. 'Transfer the data to Excel.
    30. oSheet.Range("A2").CopyFromRecordset(rs)
    31. 'Save the workbook and quit Excel.
    32. oBook.SaveAs(sSampleFolder() & "Book3.xlsx")
    33. oSheet = Nothing
    34. oBook = Nothing
    35. oExcel.Quit()
    36. oExcel = Nothing
    37. GC.Collect()
    38. 'Close the connection
    39. rs.Close()
    40. conn.Close()
    41. End Sub

    Ich persönlich halte nix von Try-Catch (bis auf gaaaanz wenig Ausnahmen).
    In deinem Fall ist es absolut unnötig. Wenn du dir nicht sicher bist, ob die DB da liegt wo sie liegt, mach nen File.Exists und behandle es.
    Deine Frage war ja, wie du auf eine spezielle Datenbanktabelle zugreifen kannst. Wenn ich das Beispiel richtig deute ist dort "angenommen" als Datenbanktabelle angesprochen. Das kannst ja wild ersetzen.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Test(ByVal dbPfad As String, ByVal sampleFolder As String)
    2. 'Definition von Variablen
    3. Dim conn As New ADODB.Connection ' Datenbankverbindung
    4. Dim rs As New ADODB.Recordset ' Recordset (ein Recordset = eine Zeile der Datenbanktabelle)
    5. Dim sql As String = "" ' Hier kommt nachher der SQL Select rein
    6. Dim xls_Appl As New Application ' Excel Anwendung
    7. Dim xls_Mappe As Workbook ' Excel Arbeitsmappe
    8. Dim xls_Blatt As Worksheet ' Excel Blatt (Tabelle)
    9. Dim n As Integer ' Zählvariable für die einzelnen Spalten
    10. 'Aufbau der Datenbankverbindung
    11. conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data source=" & dbPfad
    12. If Not File.Exists(dbPfad) Then Return 'Wenn Datenbankdatei nicht vorhanden, abbruch der Prozedur
    13. conn.Open()
    14. param.Direction = ADODB.ParameterDirectionEnum.adParamInput
    15. param.Type = ADODB.DataTypeEnum.adVarChar
    16. 'Definition der gewünschten Daten
    17. sql = "Select * FROM Tabelle1"
    18. 'oder mit Filter
    19. 'Sql = "Select * FROM Vertriebsbelege WHERE Firma = '10' and BelegArt = 'L' and Offen = true"
    20. 'Öffnen eines Recordsets
    21. rs.Open(sql, conn, ADODB.CursorTypeEnum.adOpenKeyset, ADODB.LockTypeEnum.adLockReadOnly)
    22. 'adOpenKeyset erlaubt das durchlaufen der Tabelle in beide Richtungen (nächste und vorherige Zeile)
    23. 'adLockReadOnly... naja weil du nur lesen willst, denk ich selbstverständlich
    24. xls_Mappe = xls_Appl.Workbooks.Add() 'Neue Mappe in Excel öffnen
    25. xls_Blatt = DirectCast(xls_Mappe.ActiveSheet, Worksheet) 'Die Aktuelle Tabelle nutzen
    26. 'Überschriften schreiben
    27. For n = 1 To rs.Fields.Count
    28. DirectCast(xls_Blatt.Cells(1, n), Range).Value = rs.Fields(n - 1).Name
    29. Next
    30. 'Daten übertragen
    31. xls_Blatt.Range("A2").CopyFromRecordset(rs)
    32. 'Speichern und schließen
    33. xls_Mappe.SaveAs(Path.Combine(sampleFolder, "Book.xlsx"))
    34. xls_Blatt = Nothing
    35. xls_Mappe = Nothing
    36. xls_Appl.Quit()
    37. xls_Appl = Nothing
    38. GC.Collect()
    39. 'Verbindungen schließen
    40. rs.Close()
    41. conn.Close()
    42. End Sub
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    Vielen Dank vorab nochmal. Ich habe die Verbindung als Connection() schon definiert und bräuchte ja eg nur noch ausführen oder nicht? oder muss ich die Verbindung nocheinmal deklarieren? Was ist der Unterschied zwischen ADODB und OLEDB?
    Der Unterschied ist... Es ist etwas völlig anderes ^^
    stackoverflow.com/questions/37…erence-in-adodb-and-oledb
    Entscheid dich für eine Variante.
    Gibt in der Anleitung von MS für ADODB und OLEDB nen Snippet.
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D

    VB.NET-Quellcode

    1. Private Sub btnExport_Click(sender As Object, e As EventArgs) Handles btnExport.Click
    2. Dim conn As New OleDbConnection
    3. Dim cmd As New OleDbCommand
    4. Dim reader As OleDbDataReader
    5. Dim MSEXCEL As New Excel.Application
    6. Dim counter As Integer
    7. Dim Dateiname As String
    8. Dateiname = "Die erste Datei"
    9. MSEXCEL.Worksheets().Add()
    10. DirectCast(MSEXCEL.Sheets(), Excel.Worksheet).Name = "ExportTabelle"
    11. MSEXCEL.Range("A:A").NumberFormat = "0000"
    12. MSEXCEL.Range("A1").Activate()
    13. MSEXCEL.ActiveCell.Value = "Überschrift Spalte1"
    14. MSEXCEL.Range("B1").Activate()
    15. MSEXCEL.ActiveCell.Value = "Überschrift Spalte2"
    16. MSEXCEL.Range("C1").Activate()
    17. MSEXCEL.ActiveCell.Value = "Überschrift Spalte3"
    18. conn.ConnectionString =
    19. "Provider=Microsoft.ACE.OLEDB.12.0;" &
    20. "Data Source=C:\MeinPfad\DB.accdb"
    21. conn.Open()
    22. Try
    23. cmd.CommandText = "SELECT * FROM angenommen order by ID asc;"
    24. reader = cmd.ExecuteReader()
    25. Do While reader.Read()
    26. counter += 1
    27. MSEXCEL.Range("A" & counter).Activate()
    28. MSEXCEL.ActiveCell.Value = reader("Spalte1")
    29. MSEXCEL.Range("B" & counter).Activate()
    30. MSEXCEL.ActiveCell.Value = reader("Spalte2")
    31. MSEXCEL.Range("C" & counter).Activate()
    32. MSEXCEL.ActiveCell.Value = reader("Spalte3")
    33. Loop
    34. counter = 1
    35. reader.Close()
    36. DirectCast(MSEXCEL.Sheets(), Excel.Worksheet).Delete()
    37. MSEXCEL.Visible = False
    38. MSEXCEL.ActiveWorkbook.SaveAs(Filename:="C:\Export_" & Dateiname & ".xlsx")
    39. MSEXCEL.Workbooks("Export_" & Dateiname & ".xlsx").Activate()
    40. MSEXCEL.Workbooks.Close()
    41. MSEXCEL.Quit()
    42. MSEXCEL = Nothing
    43. Catch ex As Exception
    44. MessageBox.Show(ex.Message)
    45. End Try
    46. conn.Close()
    47. End Sub



    Also das ist eine Zusammenstellung dessen, was für mich plausibel war. Allerdings kommt jetzt die Fehlermeldung:

    Ausnahme von HRESULT: 0x800A03EC

    Habt ihr ne Idee wo es hängt? Ich stehe hier kurz vor einem Breakdown :D

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

    THEMAN87 schrieb:

    MSEXCEL.Range("A" & counter).Activate()
    MSEXCEL.ActiveCell.Value = reader("Spalte1")
    Macrorecorder lässt grüßen :D

    Bitte, bitte nicht mit ActiveCell arbeiten.
    Der obige Konstrukt lässt sich viel ungefährlicher und performanter ohne Umweg erledigen:
    MSEXCEL.Range("A" & counter).Value = reader("Spalte1")
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --