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
Viele Grüße
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.
VB.NET-Quellcode
- Private Sub ExportierenToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles ExportierenToolStripMenuItem.Click
- If OpenFileDialog1.ShowDialog() = DialogResult.OK AndAlso OpenFileDialog1.FileName.EndsWith(".xlsx") Then
- Dim Excel As New ExcelHelper
- Try
- Excel.Export(OpenFileDialog1.FileName)
- Finally
- Excel.Dispose()
- End Try
- End If
- End Sub
- '
- Imports System.Runtime.InteropServices
- Imports Microsoft.Office.Interop
- Friend Class ExcelHelper
- Implements IDisposable
- Private disposedValue As Boolean
- Private _excel As Excel.Application
- Private _Books As Excel.Workbooks
- Private _Book As Excel.Workbook
- Private _Sheets As Excel.Sheets
- Private ReadOnly _WSheets As List(Of Excel.Worksheet)
- Private _Sheet As Excel.Worksheet
- Private ReadOnly _Ranges As List(Of Excel.Range)
- Private _Range As Excel.Range
- Friend Sub New()
- _excel = New Excel.Application()
- _WSheets = New List(Of Excel.Worksheet)
- _Ranges = New List(Of Excel.Range)
- End Sub
- Friend Sub Export(PathOfTemplate As String)
- _Books = _excel.Workbooks
- _Book = _Books.Open(PathOfTemplate)
- _Sheets = _Book.Worksheets
- For i = 1 To _Sheets.Count
- _WSheets.Add(DirectCast(_Sheets(i), Excel.Worksheet))
- Next
- ''Testblub
- _Ranges.Add(_WSheets(0).Range("A2:E6", Reflection.Missing.Value))
- Dim saRet(5, 5) As Double
- For iRow = 0 To 5
- For iCol = 0 To 5
- saRet(iRow, iCol) = iRow * iCol
- Next iCol
- Next iRow
- _Ranges(0).Value = saRet
- ''
- _Book.Close(SaveChanges:=True)
- _Books.Close()
- End Sub
- Protected Overridable Sub Dispose(ByVal disposing As Boolean)
- If Not disposedValue Then
- If disposing Then
- 'Managed Disposes here
- End If
- If _Range IsNot Nothing Then
- Marshal.FinalReleaseComObject(_Range)
- _Range = Nothing
- End If
- If _Ranges.Count > 0 Then
- For Each rng In _Ranges
- Marshal.FinalReleaseComObject(rng)
- Next
- _Ranges.Clear()
- End If
- If _Sheet IsNot Nothing Then
- Marshal.FinalReleaseComObject(_Sheet)
- _Sheet = Nothing
- End If
- If _WSheets.Count > 0 Then
- For Each sht In _WSheets
- Marshal.FinalReleaseComObject(sht)
- Next
- _WSheets.Clear()
- End If
- If _Sheets IsNot Nothing Then
- Marshal.FinalReleaseComObject(_Sheets)
- _Sheets = Nothing
- End If
- If _Book IsNot Nothing Then
- Marshal.FinalReleaseComObject(_Book)
- _Book = Nothing
- End If
- If _Books IsNot Nothing Then
- Marshal.FinalReleaseComObject(_Books)
- _Books = Nothing
- End If
- If _excel IsNot Nothing Then
- _excel.Quit()
- Marshal.FinalReleaseComObject(_excel)
- _excel = Nothing
- End If
- disposedValue = True
- End If
- End Sub
- Protected Overrides Sub Finalize()
- Dispose(disposing:=False)
- End Sub
- Friend Sub Dispose() Implements IDisposable.Dispose
- Dispose(disposing:=True)
- GC.SuppressFinalize(Me)
- End Sub
- End Class
- '
Viele Grüße