schreibgeschützte Excel Datei nach Export

  • VB.NET

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von chris_2091.

    schreibgeschützte Excel Datei nach Export

    Hallo zusammen,

    ich möchte Nutzereingaben von vb.Net nach Excel in eine bestehende Datei exportieren.
    Im ersten Schritt kann man die Excel-Datei durch ein OpenFileDialog aussuchen. Dann wird die Datei geöffnet und ein neues Worksheet erstellt.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports Excel = Microsoft.Office.Interop.Excel
    2. Private Sub Button_ExportEinstellung_Click(sender As Object, e As EventArgs) Handles Button_ExportEinstellung.Click
    3. GlobaleVariablen.probandenID = TextBox1.Text
    4. Dim xlApp As Excel.Application
    5. Dim xlWorkBook As Excel.Workbook
    6. ' Start Excel and get Application object.
    7. xlApp = CreateObject("Excel.Application")
    8. GlobaleVariablen.nutzerID = TextBox1.Text'damit Nutzer-ID auch für andere Formen nutzbar
    9. GlobaleVariablen.filepath = TextBox_Speicherort.Text
    10. Dim filePath As String = TextBox_Speicherort.Text
    11. If My.Computer.FileSystem.FileExists(filePath) = True Then
    12. xlWorkBook = xlApp.Workbooks.Open(filePath)
    13. Dim worksheets As Excel.Sheets = xlWorkBook.Worksheets
    14. Dim xlNewSheet = DirectCast(worksheets.Add(worksheets(1), Type.Missing, Type.Missing, Type.Missing), Excel.Worksheet)
    15. xlNewSheet.Name = "ID " + TextBox1.Text
    16. 'xlNewSheet = xlWorkBook.Sheets("sheet1")
    17. xlNewSheet.Select()
    18. 'Schreiben der neuen Daten
    19. With xlNewSheet
    20. .Cells(1, 1).Value = "Datum:"
    21. .Cells(1, 3).value = "Uhrzeit:".
    22. Cells(2, 1).Value = "Nutzer-ID:"
    23. .Cells(1, 2).Value = TextBox2.Text 'Datum
    24. .Cells(1, 4).value = TextBox3.Text 'Uhrzeit
    25. .Cells(2, 2).Value = "'" + TextBox1.Text 'Nutzer-Id
    26. End With
    27. xlWorkBook.Save()
    28. xlWorkBook.Close()
    29. ' Release object references.
    30. releaseObject(xlNewSheet)'releaseObject ist eine Funktion die Objekte löscht
    31. releaseObject(worksheets)
    32. releaseObject(xlWorkBook)
    33. releaseObject(xlApp)
    34. releaseObject(raXL)
    35. MessageBox.Show("Die Datei wurde abgespeichert", "Abspeichern in Excel", MessageBoxButtons.OK, MessageBoxIcon.Information)
    36. Else
    37. MessageBox.Show("Die Datei wurde nicht gefunden" + Environment.NewLine + "Bitte prüfen Sie den Pfad", "Falscher Pfad", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
    38. End If
    39. End Sub

    VB.NET-Quellcode

    1. Private Sub releaseObject(ByVal obj As Object)
    2. Try
    3. System.Runtime.InteropServices.Marshal.ReleaseComObject(obj)
    4. obj = Nothing
    5. Catch ex As Exception
    6. obj = Nothing
    7. Finally
    8. GC.Collect()
    9. End Try
    10. End Sub


    Hier kommt anfangs keine Fehlermeldung, wird die gleiche Datei mehrmals benutzt, sprich bei mehreren Nutzerprofilen(bei mehreren Programmstarts ) kommt ein Fenster mit folgenden Text:
    "Eine Datei mit dem Namen "XYZ" ist bereits diesen Speicherort vorhanden. Soll sie ersetzt werden?"
    Bei Ja läuft das Programm ganz normal durch, aber ich möchte in einer anderen Form weitere Daten zu der gleichen anfangs erstellten Sheet hinzufügen, da kommt dann der Fehler
    Ungültiger Index. Die Excel-Datei ist dann schreibgeschützt

    Wenn ich eine neue Excel-Datei erstelle und diese einmalig öffne und eine neues Worksheet hinzufüge und es bearbeite, funktioniert es gut.
    Dann wird aber beim nächsten Programmstart die gleiche Datei genommen, ist die Datei anscheinend schreibgeschützt, obwohl sie für mich nicht sichtbar ist.
    Im Task-Manager taucht bei Anwendungen nichts von Excel auf, dafür aber bei den Prozessen. Dort stehen dann mehrere Excel-Prozesse.
    Kille ich alle diese Excel-Prozesse starte mein Programm neu, dann funktioniert das ganze wieder, aber nur 1,2 Mal.
    Dann stehen aber wieder neue Excel-Prozesse im Task-Manager.

    Dazu habe ich folgendes hier im Forum einiges gefunden, daher habe ich auch diese Release-Funktion eingebaut. Doch die hilft nicht wirklich.

    Ist ein bekanntest Problem bei Interop.Excel.
    Die instantiierten Excel-Objekte müssen einzeln Disposed werden.
    Alle, also auch die zugewiesenen Worksheets und Ranges und ...

    Du kannst dir mal diesen Thread durchlesen:
    Excel richtig schließen

    Oder du arbeitest mit EPPlus (kannst du über nuget laden), dann hast du die Probleme nicht.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --