Laden...

Excel-Datei generieren - Best Practice?

Erstellt von Jacyrio vor 8 Jahren Letzter Beitrag vor 8 Jahren 2.762 Views
J
Jacyrio Themenstarter:in
197 Beiträge seit 2006
vor 8 Jahren
Excel-Datei generieren - Best Practice?

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 😃

16.807 Beiträge seit 2008
vor 8 Jahren

OpenXML waere hier das Stichwort.

W
872 Beiträge seit 2005
vor 8 Jahren

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.

J
Jacyrio Themenstarter:in
197 Beiträge seit 2006
vor 8 Jahren

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 😃

T
62 Beiträge seit 2012
vor 8 Jahren

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 😃

L
136 Beiträge seit 2015
vor 8 Jahren

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