Laden...

Excel Datei aus Resources öffnen und füllen C'# Windows Forms

Erstellt von Krachgarten vor 3 Jahren Letzter Beitrag vor 3 Jahren 1.021 Views
K
Krachgarten Themenstarter:in
8 Beiträge seit 2017
vor 3 Jahren
Excel Datei aus Resources öffnen und füllen C'# Windows Forms

Hallo Zusammen,

ich habe das Problem das ich eine kleine Software erstellt habe um eine Excel Vorlage mit Daten und Berechnungen zu füllen. Das Funktioniert aktuell auch ganz gut mit folgenden code:

string User = Environment.UserName;
                string sourceDir = @"C:\Users\" + User + "\\source\\repos\\Deckblatt\\Deckblatt\\Resources\\Deckblatt_Vorlage.xlsx";
                string backupDir = @"C:\Users\" + User + "\\Desktop\\Deckblatt_Speicherort\\" + nummer + ".xlsx";
                File.Copy(sourceDir, backupDir);

                object n = System.Reflection.Missing.Value;
                string Pfad = backupDir;

                Excel.Application exapp = new Excel.Application();
                Excel.Workbook wb =
                exapp.Workbooks.Open(Pfad, n, n, n, n, n, n, n, n, n, n, n, n, n, n);
                Excel.Worksheet worksheet = new Excel.Worksheet();
                worksheet = (Excel.Worksheet)exapp.ActiveWorkbook.ActiveSheet;
                exapp.Visible = true;

Jetzt möchte ich das aber gerne so haben das ich das "veröffentliche Projekt" einem Kollegen senden kann und er die Datei auch öffnen kann. Also aus dem Programm herraus. Aktuell müsste er den von mir definierten Pfad der Datei ja erstmal erstellen.

So nun habe ich die Datei als "eingebettete Resource" in mein projekt eingefügt und folgendermaßen geladen:

private void button1_Click(object sender, EventArgs e)
        {
            var res = GetResource();
            
        }

        public static string GetResource()
        {
            System.Reflection.Assembly asm = System.Reflection.Assembly.GetExecutingAssembly();

            string val = String.Empty;
            // das ist im Prinzip der Pfad des Files nur anstatt Backslashes mit Punkten als Trennzeichen
            string resourceName = "Aufrufen.Properties.Deckblatt_Vorlage.xlsx";
            
            System.IO.Stream strm = asm.GetManifestResourceStream(resourceName);

            System.IO.StreamReader reader = new System.IO.StreamReader(strm);



            val = reader.ReadToEnd();
            reader.Close();

            return val;
        }

Jetzt verstehe ich nur nicht wie ich die Excel Datei damit öffnen kann. Ist das möglich? Und kann ich dann weiterhin mit folgenden Code füllen? z.B:

 worksheet.Cells[3, 31] = Maschinenummer;

Also ich möchte das ich meinen Kollegen keine Excel Datei schicken muss. Sondern diese direkt im Projekt integriert haben. Und beim benutzen des Programms soll diese Lokal bei den Nutzern abgespeichert werden.

Ich hoffe ihr versteht meine Frage und könnt helfen. Grüße =)

16.835 Beiträge seit 2008
vor 3 Jahren

Dann musst Du die Excel Datei aus der Resource extrahieren und eben auf dem lokalen Dateisystem abspeichern.
Im Stream allein reichts Dir ja nicht; und geht mit Excel auch gar nicht.

Ansonsten:

  • Pfade kombiniert man mit Path.Combine und nicht über String-Operationen.
  • Stream sollte man in using() packen, wenn möglich (hier mglich und sinnvoll)
K
Krachgarten Themenstarter:in
8 Beiträge seit 2017
vor 3 Jahren

Danke für die schnelle Antwort.

Dann musst Du die Excel Datei aus der Resource extrahieren und eben auf dem lokalen Dateisystem abspeichern.
Im Stream allein reichts Dir ja nicht; und geht mit Excel auch gar nicht.

Hast du da ein Beispiel für? Alles was ich grade ergoogelt habe wirft bei mir Fehler auf. Irgendwie vermute ich das die Datei falsch hinterlegt ist. Obwohl mein Streamreader ja drauf zugreifen kann, denke ich 😄.

Ansonsten:

  • Pfade kombiniert man mit Path.Combine und nicht über String-Operationen.
  • Stream sollte man in using() packen, wenn möglich (hier mglich und sinnvoll)

Danke für die Hinweise/Tipps, werde ich berücksichtigen.

16.835 Beiträge seit 2008
vor 3 Jahren

Manchmal reicht auch nachdenken statt googlen 😉
Musst ja nicht alles per Copy Paste erschlagen. Bist doch Entwickler.

  • Resource lesen und in einen Stream packen
  • Stream in eine Datei schreiben
  • Stream schließen
  • Datei öffnen

Alle Schritte kannst Du aller aller spätestens über die Microsoft Docs lösen.
Wenn Du die Docs dann richtig bedienst, dann siehste, dass Du prinzipiell nicht mal die Streams handhaben musst, weil alles über die File-Klasse geschenkt bekommst - mit einer Zeile Code.

2.079 Beiträge seit 2012
vor 3 Jahren

Dazu gibt's übrigens massig fertige Beispiele, man muss sie nur suchen 😄

Aber noch als Zusatz:

Zum Bearbeiten von Excel hab ich das letzte Mal ClosedXML genutzt.
Ein wahnsinnig intuitives Framework, damit macht Excel bearbeiten richtig Spaß. Leider gibt's das nur für Excel.

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.

K
Krachgarten Themenstarter:in
8 Beiträge seit 2017
vor 3 Jahren

Habs jetzt soweit hinbekommen. Über die Eleganz des Codes kann man streiten. Aber soweit klappt es.

Danke für die Hilfestellung =)