{"id":55000106,"date":"2017-10-01T00:00:00","date_gmt":"2020-03-27T19:28:55","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=106"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"ExcelExport_mit_Spreadsheet_Light","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/ExcelExport_mit_Spreadsheet_Light\/","title":{"rendered":"Excel-Export mit Spreadsheet Light"},"content":{"rendered":"<p><b>Das Thema Reporting haben wir im DATENBANKENTWICKLER noch gar nicht behandelt. Das liegt auch daran, dass es unter C#\/WPF keine so einfach einsetzbare Reporting-Funktion wie etwa die Berichte und Access gibt. Also wollen wir uns einmal verschiedene M&ouml;glichkeiten ansehen, um die Daten einer Datenbank aus einer C#-Anwendung zu exportieren, um diese etwa in einer anderen Anwendung zu &ouml;ffnen und auszudrucken. Den Start machen wir mit Microsoft Excel.<\/b><\/p>\n<h2>Voraussetzungen<\/h2>\n<p>In diesem Artikel wollen wir uns nicht, wie etwas unter Access\/VBA m&ouml;glich, per Automation an Excel heranwagen und die Excel-Dokumente per Excel erstellen. Stattdessen nutzen wir eine Bibliothek namens <b>Spreadsheet Light<\/b>, welche kostenlos verf&uuml;gbar ist und Excel-Dateien erstellen kann, ohne dass Excel &uuml;berhaupt auf dem Rechner existiert. Das ist nat&uuml;rlich gerade f&uuml;r Webanwendungen interessant, da so keine Office-Installation ben&ouml;tigt wird, aber auch f&uuml;r Desktop-Anwendungen.<\/p>\n<h2>Spreadsheet light installieren<\/h2>\n<p><b>Spreadsheet light <\/b>ist eine Open Source-Anwendung, die Sie kostenlos in Ihren Projekten d&uuml;rfen. In den Beispielen verwenden wir ein C#\/WPF-Projekt, dem Sie noch das entsprechende Paket plus Verweis hinzuf&uuml;gen m&uuml;ssen. Sie finden den Eintrag <b>SpreadsheetLight<\/b> im Nuget-Paket-Manager, den Sie &uuml;ber den Kontextmen&uuml;-Eintrag <b>Nuget-Pakete verwalten <\/b>des Projekts im Projektmappen-Explorer starten (siehe Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_05\/pic_106_004.png\" alt=\"Hinzuf&uuml;gen von SpreadsheetLight &uuml;ber den Nuget-Paket-Manager\" width=\"649,559\" height=\"448,84\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Hinzuf&uuml;gen von SpreadsheetLight &uuml;ber den Nuget-Paket-Manager<\/span><\/b><\/p>\n<h2>Erste leere Excel-Datei erzeugen<\/h2>\n<p>Damit haben wir alle Voraussetzungen geschaffen. Ein erstes Beispiel wollen wir durch einen Mausklick auf eine neue Schaltfl&auml;che namens <b>btnDateiErstellen <\/b>ausf&uuml;hren. Diese f&uuml;gen wir dem Fenster <b>MainWindow.xaml <\/b>hinzu und tragen f&uuml;r die Ereignisprozedur <b>btnDateiErstellen_Click <\/b>die folgenden beiden Befehle ein:<\/p>\n<pre>private void btnDateiErstellen_Click(object sender, RoutedEventArgs e) {\r\n     SLDocument xls = new SLDocument();\r\n     xls.SaveAs(\"LeereDatei.xlsx\");\r\n}<\/pre>\n<p>Der hier verwendete Typ <b>SLDocument <\/b>d&uuml;rfte nun noch als fehlerhaft markiert werden. Das ist kein Problem &#8211; nachdem Sie den Verweis auf den Namespace <b>SpreadsheetLight <\/b>hinzugef&uuml;gt haben, verschwindet die Markierung:<\/p>\n<pre>using SpreadsheetLight;<\/pre>\n<p>Wenn Sie das Projekt nun starten und die Schaltfl&auml;che bet&auml;tigen, erstellt die Anwendung im Hintergrund ein erstes, leeres Excel-Dokument (siehe Bild 2). Das neue Dokument wurde &uuml;brigens im Verzeichnis der erstellte <b>.exe<\/b>-Datei erstellt, also beim Testen von Visual Studio aus etwa im Verzeichnis <b>bin\\Debug <\/b>des Projektverzeichnisses.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_05\/pic_106_005.png\" alt=\"Die erste per SpreadsheetLight erstellt Excel-Datei\" width=\"599,593\" height=\"320,4074\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Die erste per SpreadsheetLight erstellt Excel-Datei<\/span><\/b><\/p>\n<p>Wenn Sie Excel schon einmal von Access\/VBA aus automatisiert haben, wissen Sie, dass Sie sonst einige Befehle mehr ben&ouml;tigen. Schauen wir uns nun an, wie wir die Excel-Datei f&uuml;llen und formatieren k&ouml;nnen.<\/p>\n<h2>Daten zur Excel-Tabelle hinzuf&uuml;gen<\/h2>\n<p>Im zweiten Beispiel wollen wir eine Zelle der Tabelle mit einem Wert f&uuml;llen, in diesem Fall einer Zeichenkette. Dazu verwenden wir die Methode <b>SetCellValue<\/b>, die als ersten Parameter die Angabe des Zellbezugs erwartet (hier <b>&#8220;A1&#8221;<\/b>) und als zweiten Parameter den einzuf&uuml;genden Wert (<b>&#8220;BeispielText&#8221;<\/b>):<\/p>\n<pre>private void btnWertSchreiben_Click(object sender, RoutedEventArgs e) {\r\n     SLDocument xls = new SLDocument();\r\n     xls.SetCellValue(\"A1\", \"Beispieltext\");\r\n     xls.SaveAs(\"LeereDatei.xlsx\");\r\n}<\/pre>\n<p>Dabei markiert Visual Studio nun die Anweisung mit der Methode <b>SetCellValue <\/b>und liefert eine Fehlermeldung, nach der ein Verweis auf die Bibliothek <b>DocumentFormat.OpenXML <\/b>fehlt. Diese f&uuml;gen Sie durch Auswahl des Men&uuml;eintrags <b>Projekt|Verweis hinzuf&uuml;gen&#8230; <\/b>und die Auswahl des Eintrags <b>DocumentFormat.OpenXML <\/b>im nun erscheinenden Dialog <b>Verweis-Manager <\/b>hinzu (siehe Bild 3). Anschlie&szlig;end verschwindet auch diese Fehlermarkierung und Sie k&ouml;nnen das Einf&uuml;gen des Zellinhalts nach dem Start des Debuggens und einem Klick auf die Schaltfl&auml;che <b>cmdWertSchreiben <\/b>ausprobieren.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_05\/pic_106_006.png\" alt=\"Verweis auf die Bibliothek DocumentFormat.OpenXML\" width=\"599,593\" height=\"280,9116\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Verweis auf die Bibliothek DocumentFormat.OpenXML<\/span><\/b><\/p>\n<h2>Verschiedene Zellbez&uuml;ge<\/h2>\n<p>Im ersten Beispiel haben wir als Zellbezug mit <b>A1 <\/b>die klassische Variante gew&auml;hlt. Excel zeigt ja auch die Zeilen&uuml;berschriften als Buchstaben und die Spalten&uuml;berschriften als Zahlen an. F&uuml;r die Programmierung ist dies indes nicht unbedingt immer hilfreich, vor allem, wenn Sie Daten innerhalb einer Schleife in die Excel-Tabelle schreiben wollen. Doch das ist unter <b>Spreadsheet Light <\/b>kein Problem: Die Methode <b>SetCellValue<\/b> bietet insgesamt 36 &Uuml;berladungen. Warum so viele Erstens, weil die Methode verschiedene Datentypen f&uuml;r den einzuf&uuml;genden Wert entgegennehmen k&ouml;nnen soll, in diesem Fall <b>bool<\/b>, <b>byte<\/b>, <b>DateTime<\/b>, <b>decimal<\/b>, <b>InlineString<\/b>, <b>double<\/b>, <b>float<\/b>, <b>int<\/b>, <b>long<\/b>, <b>short<\/b>, <b>SLRstType<\/b>, <b>string, uint<\/b>, <b>ulong<\/b>, <b>ushort<\/b>, <b>DateTime <\/b>(mit <b>bool <\/b>f&uuml;r 1904-Epoche), <b>DateTime <\/b>(als <b>string<\/b>), <b>DateTime <\/b>(mit <b>bool <\/b>f&uuml;r 1904-Epoche als String). Das sind bereits 18 Varianten f&uuml;r den zweiten Parameter. Diese gibt es jeweils in Kombination mit dem <b>string<\/b>-Parameter <b>CellReference <\/b>(also beispielsweise <b>&#8220;A1&#8221;<\/b>) und mit den beiden <b>int<\/b>-Parametern <b>RowIndex <\/b>und <b>ColumnIndex <\/b>zur Angabe der zu f&uuml;llenden Zelle als 1-basierten Index.<\/p>\n<p>Wenn Sie also eine Matrix von 10&#215;10 Zellen jeweils mit dem Produkt des Zellindexes f&uuml;llen wollen, verwenden Sie die folgende Methode:<\/p>\n<pre>private void btnZehnMalZehn_Click(object sender, RoutedEventArgs e) {\r\n     SLDocument xls = new SLDocument();\r\n     for (int i = 1; i &lt; 11; i++) {\r\n         for (int j = 0; j &lt; 11; j++) {\r\n             xls.SetCellValue(i, j, i*j);\r\n         }\r\n     }\r\n     xls.SaveAs(\"ZehnMalZehn.xlsx\");\r\n}<\/pre>\n<div class=\"rcp_restricted\"><p><span style=\"color: #ff0000;\">M&ouml;chten Sie weiterlesen? Dann l&ouml;sen Sie Ihr Ticket!<\/span><br \/>\n<span style=\"color: #ff0000;\">Hier geht es zur Bestellung des Jahresabonnements des Magazins <strong>Visual Basic Entwickler<\/strong>:<\/span><br \/>\n<span style=\"color: #ff0000;\"><a style=\"color: #ff0000;\" href=\"https:\/\/shop.minhorst.com\/magazine\/363\/visual-basic-entwickler-jahresabonnement?c=77\">Zur Bestellung ...<\/a><\/span><br \/>\n<span style=\"color: #ff0000;\">Danach greifen Sie sofort auf <strong>alle rund 200 Artikel<\/strong> unseres Angebots zu - auch auf diesen hier!<\/span><br \/>\n<span style=\"color: #000000;\">Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:<\/span><\/p>\n<\/div>\n\n\t\n\t<form id=\"rcp_login_form\"  class=\"rcp_form\" method=\"POST\" action=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000106\/\">\n\n\t\t\n\t\t<fieldset class=\"rcp_login_data\">\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_login\">Username or Email<\/label>\n\t\t\t\t<input name=\"rcp_user_login\" id=\"rcp_user_login\" class=\"required\" type=\"text\"\/>\n\t\t\t<\/p>\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_pass\">Password<\/label>\n\t\t\t\t<input name=\"rcp_user_pass\" id=\"rcp_user_pass\" class=\"required\" type=\"password\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t\t<p>\n\t\t\t\t<input type=\"checkbox\" name=\"rcp_user_remember\" id=\"rcp_user_remember\" value=\"1\"\/>\n\t\t\t\t<label for=\"rcp_user_remember\">Remember me<\/label>\n\t\t\t<\/p>\n\t\t\t<p class=\"rcp_lost_password\"><a href=\"\/data\/wp\/v2\/posts\/55000106?rcp_action=lostpassword\"><\/a><\/p>\n\t\t\t<p>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_action\" value=\"login\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_redirect\" value=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000106\/\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"28cddb3e50\"\/>\n\t\t\t\t<input id=\"rcp_login_submit\" class=\"rcp-button\" type=\"submit\" value=\"Login\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t<\/fieldset>\n\n\t\t\n\t<\/form>\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Das Thema Reporting haben wir im DATENBANKENTWICKLER noch gar nicht behandelt. Das liegt auch daran, dass es unter C#\/WPF keine so einfach einsetzbare Reporting-Funktion wie etwa die Berichte und Access gibt. Also wollen wir uns einmal verschiedene M&ouml;glichkeiten ansehen, um die Daten einer Datenbank aus einer C#-Anwendung zu exportieren, um diese etwa in einer anderen Anwendung zu &ouml;ffnen und auszudrucken. Den Start machen wir mit Microsoft Excel.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662017,66052017,44000027,44000012],"tags":[],"yst_prominent_words":[],"class_list":["post-55000106","post","type-post","status-publish","format-standard","hentry","category-662017","category-66052017","category-Excel_programmieren","category-Interaktiv"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000106","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/comments?post=55000106"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000106\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000106"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000106"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000106"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000106"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}