Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Excel-Datei generieren - Best Practice?
Jacyrio
myCSharp.de - Member



Dabei seit:
Beiträge: 197

Themenstarter:

Excel-Datei generieren - Best Practice?

beantworten | zitieren | melden

Guten Abend alle miteinander,

habe eine kleine, vielleicht auch blöde, Frage. Ich suche die letzten zwei Tagen nach einer einfachen Möglichkeit einen Excel-Export zu programmieren.

Ich habe zwar schon eine Möglichkeit gefunden eine Excel-Datei zu generieren, bin aber damit irgendwie nicht zufrieden. Finde das ist viel zu kompliziert und ich finde nicht schön, dass das Programm Excel im Hintergrund öffnet! Hier mal einen Ausschnitt aus meinem Programm:


                Excel.Application excelApp = new Excel.Application();
                excelApp.Visible = false;

                Excel.Workbook excelWorkBook = excelApp.Workbooks.Add();
                Excel.Worksheet excelWorkSheet = (Excel.Worksheet)excelWorkBook.Sheets[1];

                    SqlCommand exportCommand = new SqlCommand("SELECT Bezeichnung FROM X WHERE (Y = " + Task.ID + ") ORDER BY SchemaID", this.sqlConnection);
                    SqlDataReader exportReader = exportCommand.ExecuteReader();

                    DataTable exportTable = new DataTable();
                    exportTable.Load(exportReader);

                    int i = 0;

                    foreach (DataRow dr in exportTable.Rows)
                    {
                        i++;
                        excelWorkSheet.Cells[1, i] = dr["Bezeichnung"].ToString();
                    }

                    excelWorkBook.SaveAs(@"c:\test5.xlsx");
                    excelWorkBook.Close();
                    excelApp.Quit();

Gibt es zB keine Möglichkeit die DataTable einfach an eine Excel-Datei zu übertragen ohne das man eine Forschleife durchlaufen muss? Beim Einlesen von Excel in ein DataTable (über OleDbConnection) geht das doch auch ohne weiteres.

Ich kann mir irgendwie nicht vorstellen, dass ich die Excel-Datei wirklich "manuell" per Foreach-Schleifen füllen muss.. oder wird das wirklich soo gemacht?

Außerdem will ich gerne folgendes machen:

- Summen ziehen
- Die eingefügte Matrix als Tabelle formatieren
- Evtl. Farben von Zellen ändern, Rahmen zeichnen usw.

Falls ihr dafür auch noch Tipps für mich habt, würde ich mich freuen :-)
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15.500

beantworten | zitieren | melden

OpenXML waere hier das Stichwort.
private Nachricht | Beiträge des Benutzers
weismat
myCSharp.de - Member



Dabei seit:
Beiträge: 872
Herkunft: Frankfurt am Main

beantworten | zitieren | melden

Ich benutze gerne EPPlus/ - damit sieht der Code ähnlich wie der COM Code aus, aber Du brauchst kein Excel zur Dokumentenerstellung.
OpenXML ist anhand des Dokuments orientiert - das ist manchmal etwas umständlicher.
private Nachricht | Beiträge des Benutzers
Jacyrio
myCSharp.de - Member



Dabei seit:
Beiträge: 197

Themenstarter:

beantworten | zitieren | melden

Danke an euch beide.. ich werde mir beides mal anschauen.. bin ich während meiner Suche irgendwie nicht drauf gestoßen..

Mal schauen welches für meine Bedürfnisse besser ist :)
private Nachricht | Beiträge des Benutzers
tASven
myCSharp.de - Member



Dabei seit:
Beiträge: 62

beantworten | zitieren | melden

Ich nutze z.B. https://closedxml.codeplex.com. Mir gefielen daran die recht einfachen Möglichkeitend er Formatierungen (z.B. Hintergrundfarben von Zellen) und das sehr einfache erstellen eines AutoFilters :-)
private Nachricht | Beiträge des Benutzers
lhyn
myCSharp.de - Member



Dabei seit:
Beiträge: 136

beantworten | zitieren | melden

Hallo Jacyrio,

Eine weitere Möglichkeit besteht darin, eine ganze Range in ein Excel zu übertragen.
(zweidimensionales Array)

Hier mal ein Codeausschnitt:

//Name des Worksheets ändern
oSheet.Name = "DP-Liste";

//Range A1:L1000 in Text formatieren
oSheet.get_Range("A1", "J1000").NumberFormat = "@";
                  

//Zweidimensionalen string strEintraege erstellen, welcher 12 Spalten und 1000 Zeilen fasst.
string[,] strEintraege = new string[1000, 10];

//Einfügen der Projektinformationen und Farben
oSheet.get_Range("A1", "J5").Interior.ColorIndex = 35;

//Die Range kann auch durch Variablen ersetzt werden.
startFeld = "A" + (zeile+1);
endFeld = "J" + (zeile+2);
oSheet.get_Range(startFeld, endFeld).Interior.ColorIndex = 36;

strEintraege[1, 1] = "Projektname:";
//Durch Varablen ersetzen...
strEintraege[zeile, spalte] = csvReader.Projektname;



(foreach um das Array zu befüllen...etc.)


//Range in das Excel eintragen
oSheet.get_Range("A1", "J1000").Value2 = strEintraege;

//Autofit der Spalten
oSheet.Columns.AutoFit();

//Gleich das File öffnen...wenn nicht nötig, false
oXL.Visible = true;
oXL.UserControl = true;

Somit ist das Excel-File mit einem Augenzwinkern fertig...Zelle für Zelle mit Visible= true dauert ewig und man sieht wie die Zellen gefüllt werden.

Gruss Lhyn
private Nachricht | Beiträge des Benutzers