Excel gut aufgeräumt?

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

    Excel gut aufgeräumt?

    Hallo,

    ich schreibe Werte in eine bestehende Excel-Datei, dem Code von Microsoft traue ich nicht ganz, deswegen habe ich selbst das gebastelt, was mir zu dem Thema so einfällt.
    Da solche Sachen Excel lahmlegen können, macht mich das immer bissel nervös, daher wäre es toll wenn ihr da mal drüber gucken könntet. Der Test sah gut aus.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub ExportierenToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles ExportierenToolStripMenuItem.Click
    2. If OpenFileDialog1.ShowDialog() = DialogResult.OK AndAlso OpenFileDialog1.FileName.EndsWith(".xlsx") Then
    3. Dim Excel As New ExcelHelper
    4. Try
    5. Excel.Export(OpenFileDialog1.FileName)
    6. Finally
    7. Excel.Dispose()
    8. End Try
    9. End If
    10. End Sub
    11. '
    12. Imports System.Runtime.InteropServices
    13. Imports Microsoft.Office.Interop
    14. Friend Class ExcelHelper
    15. Implements IDisposable
    16. Private disposedValue As Boolean
    17. Private _excel As Excel.Application
    18. Private _Books As Excel.Workbooks
    19. Private _Book As Excel.Workbook
    20. Private _Sheets As Excel.Sheets
    21. Private ReadOnly _WSheets As List(Of Excel.Worksheet)
    22. Private _Sheet As Excel.Worksheet
    23. Private ReadOnly _Ranges As List(Of Excel.Range)
    24. Private _Range As Excel.Range
    25. Friend Sub New()
    26. _excel = New Excel.Application()
    27. _WSheets = New List(Of Excel.Worksheet)
    28. _Ranges = New List(Of Excel.Range)
    29. End Sub
    30. Friend Sub Export(PathOfTemplate As String)
    31. _Books = _excel.Workbooks
    32. _Book = _Books.Open(PathOfTemplate)
    33. _Sheets = _Book.Worksheets
    34. For i = 1 To _Sheets.Count
    35. _WSheets.Add(DirectCast(_Sheets(i), Excel.Worksheet))
    36. Next
    37. ''Testblub
    38. _Ranges.Add(_WSheets(0).Range("A2:E6", Reflection.Missing.Value))
    39. Dim saRet(5, 5) As Double
    40. For iRow = 0 To 5
    41. For iCol = 0 To 5
    42. saRet(iRow, iCol) = iRow * iCol
    43. Next iCol
    44. Next iRow
    45. _Ranges(0).Value = saRet
    46. ''
    47. _Book.Close(SaveChanges:=True)
    48. _Books.Close()
    49. End Sub
    50. Protected Overridable Sub Dispose(ByVal disposing As Boolean)
    51. If Not disposedValue Then
    52. If disposing Then
    53. 'Managed Disposes here
    54. End If
    55. If _Range IsNot Nothing Then
    56. Marshal.FinalReleaseComObject(_Range)
    57. _Range = Nothing
    58. End If
    59. If _Ranges.Count > 0 Then
    60. For Each rng In _Ranges
    61. Marshal.FinalReleaseComObject(rng)
    62. Next
    63. _Ranges.Clear()
    64. End If
    65. If _Sheet IsNot Nothing Then
    66. Marshal.FinalReleaseComObject(_Sheet)
    67. _Sheet = Nothing
    68. End If
    69. If _WSheets.Count > 0 Then
    70. For Each sht In _WSheets
    71. Marshal.FinalReleaseComObject(sht)
    72. Next
    73. _WSheets.Clear()
    74. End If
    75. If _Sheets IsNot Nothing Then
    76. Marshal.FinalReleaseComObject(_Sheets)
    77. _Sheets = Nothing
    78. End If
    79. If _Book IsNot Nothing Then
    80. Marshal.FinalReleaseComObject(_Book)
    81. _Book = Nothing
    82. End If
    83. If _Books IsNot Nothing Then
    84. Marshal.FinalReleaseComObject(_Books)
    85. _Books = Nothing
    86. End If
    87. If _excel IsNot Nothing Then
    88. _excel.Quit()
    89. Marshal.FinalReleaseComObject(_excel)
    90. _excel = Nothing
    91. End If
    92. disposedValue = True
    93. End If
    94. End Sub
    95. Protected Overrides Sub Finalize()
    96. Dispose(disposing:=False)
    97. End Sub
    98. Friend Sub Dispose() Implements IDisposable.Dispose
    99. Dispose(disposing:=True)
    100. GC.SuppressFinalize(Me)
    101. End Sub
    102. End Class
    103. '


    Viele Grüße