Excelblatt befüllen funktioniert nicht

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

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

    Excelblatt befüllen funktioniert nicht

    Hey,

    Ich habe mich gerade daran versucht, in eine Exceldatei zu schreiben. Es geht einfach nur ums Prinzip.

    1) in der For-Schleife knallt es. Unbehandelte Ausnahme: System.Reflection.TargetInvocationException: Ein Aufrufziel hat einen Ausnahmefehler verursacht. ---> System.Runtime.InteropServices.COMException: Ausnahme von HRESULT: 0x800A03EC
    Dann muss ich das Debuggen beenden.
    2) Excel ist trotz App.Quit() noch im Taskmanager zu sehen. Wie kann ich das richtig beenden?

    .NET 4.8
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports Microsoft.Office.Interop
    2. Imports Microsoft.WindowsAPICodePack.Dialogs
    3. Public NotInheritable Class Form1
    4. Private xlApp As Excel.Application
    5. Private myWorkbook As Excel.Workbook
    6. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    7. Me.Location = New Point(0, 0)
    8. End Sub
    9. Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    10. Await Task.Run(Sub() Schreiben())
    11. End Sub
    12. Private Sub Schreiben()
    13. Dim Pfad As String
    14. Using SFD1 As New CommonSaveFileDialog
    15. SFD1.Title = "Exceldatei speichern"
    16. SFD1.Filters.Add(New CommonFileDialogFilter("Excel", ".xlsx"))
    17. If System.IO.Directory.Exists("‪C:\Users\...\source\repos\VB.NET\in Exceldatei schreiben") Then
    18. SFD1.InitialDirectory = "‪C:\Users\...\source\repos\VB.NET\in Exceldatei schreiben"
    19. Else
    20. SFD1.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop)
    21. End If
    22. Dim Result As CommonFileDialogResult
    23. Me.Invoke(Sub() Result = SFD1.ShowDialog())
    24. If Result = CommonFileDialogResult.Ok Then
    25. Pfad = SFD1.FileName & ".xlsx"
    26. Else
    27. Return
    28. End If
    29. End Using
    30. Me.Invoke(Sub() Button1.BackColor = Color.FromArgb(255, 255, 0))
    31. xlApp = New Excel.Application
    32. xlApp.Visible = True
    33. myWorkbook = xlApp.Workbooks.Add()
    34. Dim myWorksheet As Excel.Worksheet = CType(myWorkbook.Sheets("Tabelle1"), Excel.Worksheet)
    35. myWorksheet.Cells(1, 1) = "data in first cell"
    36. For i As Integer = 0 To 100 Step 1
    37. myWorksheet.Cells(i, 1) = i
    38. Next
    39. myWorksheet.SaveAs(Pfad, Excel.XlFileFormat.xlWorkbookDefault)
    40. myWorkbook.Close()
    41. xlApp.Quit()
    42. Me.Invoke(Sub() Button1.BackColor = Color.FromArgb(0, 255, 0))
    43. End Sub
    44. End Class


    Wahrscheinlich, weil i nicht 0 sein darf. Zelle(0, 1) gibt es nicht, es fängt bei Zeile 1 an, nicht 0
    Bzgl. korrektem Plattmachen: sollte mit Runtime.InteropServices.Marshal.FinalReleaseComObject() klappen, such mal danach
    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.
    ich hab da keine Probleme mit 'Quit'

    Teste das mal

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports Microsoft.Office.Interop.Excel
    3. Imports Microsoft.Office.Interop
    4. Public Class Form1
    5. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    6. Dim Path As String = "E:\" 'Pfad
    7. Dim myExcel As New Microsoft.Office.Interop.Excel.Application()
    8. Dim WorkBook As Workbook = myExcel.Workbooks.Add
    9. Dim WorkSheets As Sheets = WorkBook.Sheets
    10. For i = 1 To WorkSheets.Count 'wieviele Tabellen willst du anlegen
    11. Dim xlWorkBook As Workbook
    12. xlWorkBook = myExcel.Workbooks.Add
    13. '##### Tabelle1
    14. Dim WorkSheet1 As Worksheet = CType(CType(WorkSheets(1), Excel._Worksheet), Microsoft.Office.Interop.Excel.Worksheet)
    15. WorkSheet1.Name = "Test1"
    16. 'Tabelle1 anlegen
    17. WorkSheet1.Range("A1").Value = "Header 1"
    18. WorkSheet1.Range("B1").Value = "Header 2"
    19. WorkSheet1.Range("C1").Value = "Nr."
    20. WorkSheet1.Range("A2").Value = TextBox1.Text
    21. WorkSheet1.Range("A3").Value = TextBox2.Text
    22. 'etc
    23. '....
    24. '...
    25. '###### Tabelle2
    26. Dim WorkSheet2 As Worksheet = CType(CType(WorkSheets(2), Excel._Worksheet), Microsoft.Office.Interop.Excel.Worksheet)
    27. 'Tabelle 2 anlegen
    28. WorkSheet2.Name = "Test2"
    29. WorkSheet2.Range("A1").Value = "Test"
    30. WorkSheet2.Range("B1").Value = "was auch immer"
    31. WorkSheet2.Range("C1").Value = "etc.."
    32. 'etc..
    33. '....
    34. '...
    35. Next
    36. WorkBook.SaveAs("E:\TestFolder\ATest12.xlsx")
    37. myExcel.Application.Quit()
    38. End Sub
    39. End Class

    Danke an alle.
    Das mit For i as Integer = 1, da hab ich nicht aufgepasst.

    Mit System.Runtime.InteropServices.Marshal.ReleaseComObject(..) geht das Freigeben wunderbar.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports Microsoft.Office.Interop
    2. Imports Microsoft.WindowsAPICodePack.Dialogs
    3. Public NotInheritable Class Form1
    4. Private xlApp As Excel.Application
    5. Private myWorkbook As Excel.Workbook
    6. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    7. Me.Location = New Point(0, 0)
    8. End Sub
    9. Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    10. Await Task.Run(Sub() Schreiben())
    11. End Sub
    12. Private Sub Schreiben()
    13. Dim Pfad As String
    14. Using SFD1 As New CommonSaveFileDialog
    15. SFD1.Title = "Exceldatei speichern"
    16. SFD1.Filters.Add(New CommonFileDialogFilter("Excel", ".xlsx"))
    17. If System.IO.Directory.Exists("‪C:\Users\...\source\repos\VB.NET\in Exceldatei schreiben") Then
    18. SFD1.InitialDirectory = "‪C:\Users\...\source\repos\VB.NET\in Exceldatei schreiben"
    19. Else
    20. SFD1.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop)
    21. End If
    22. Dim Result As CommonFileDialogResult
    23. Me.Invoke(Sub() Result = SFD1.ShowDialog())
    24. If Result = CommonFileDialogResult.Ok Then
    25. Pfad = SFD1.FileName & ".xlsx"
    26. Else
    27. Return
    28. End If
    29. End Using
    30. Me.Invoke(Sub() Button1.BackColor = Color.FromArgb(255, 255, 0))
    31. xlApp = New Excel.Application
    32. xlApp.Visible = True
    33. myWorkbook = xlApp.Workbooks.Add()
    34. Dim myWorksheet As Excel.Worksheet = CType(myWorkbook.Sheets("Tabelle1"), Excel.Worksheet)
    35. For i As Integer = 1 To 1000 Step 1 'Muss bei 1 anfangen!
    36. myWorksheet.Cells(i, 1) = i
    37. Next
    38. myWorksheet.SaveAs(Pfad, Excel.XlFileFormat.xlWorkbookDefault)
    39. myWorkbook.Close()
    40. xlApp.Quit()
    41. If myWorksheet IsNot Nothing Then
    42. System.Runtime.InteropServices.Marshal.ReleaseComObject(myWorksheet)
    43. End If
    44. If myWorkbook IsNot Nothing Then
    45. System.Runtime.InteropServices.Marshal.ReleaseComObject(myWorkbook)
    46. End If
    47. If xlApp IsNot Nothing Then
    48. System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp)
    49. End If
    50. xlApp = Nothing
    51. myWorkbook = Nothing
    52. myWorksheet = Nothing
    53. 'GC.Collect() ' Für den Fall der Fälle.
    54. Me.Invoke(Sub() Button1.BackColor = Color.FromArgb(0, 255, 0))
    55. End Sub