myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Gemeinschaft » .NET-Komponenten und C#-Snippets » Excel-Export ohne Excel (Snippet)
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Excel-Export ohne Excel (Snippet)

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Rainbird Rainbird ist männlich
myCSharp.de-Poweruser/ Experte

avatar-2834.jpg


Dabei seit: 28.05.2005
Beiträge: 3.723
Entwicklungsumgebung: Visual Studio 2012
Herkunft: Mauer


Rainbird ist offline

Excel-Export ohne Excel (Snippet)

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Beschreibung:

Microsoft Excel ist ein beliebtes Werkzeug, um mit Tabellen zu arbeiten. Deshalb wird es bei den Endanwendern hoch geschätzt, wenn eine Anwendung Daten im Excel-Format exportieren kann.
Da viele Geschäftsanwendungen heute allerdings Webanwendungen sind, gibt es mit Excel ein Problem. Auf dem Webserver ist Excel nicht installiert. Selbst wenn, würde ein Excel-Export mit COM Fernsteuerung des Excel-Objektmodells niemals schnell und zuverlässig funktionieren. Was nun?
Seit Excel 2003 gibt es einen sehr einfachen Weg, Excel-Dokumente ganz ohne Excel zu erzeugen, und zwar mit XML. Das kann eine PHP- oder ASP.NET-Anwendung ohne Probleme. XML ist ja nur Text und kann theoretisch sogar mit einfacher Stringverkettung erzeugt werden.

Da sich scheinbar viele Leute vom komplexen Schema des Excel-XML-Dialekts SpreadsheetML einschüchtern lassen, möchte ich mit diesem Snippet das Eis brechen und zeigen, wie einfach man mit XML-Technologie Excel-Dokumente erzeugen kann.

Die Referenz-Schemas für Office 2003 und damit auch für SpreadsheetML gibts hier zum kostenfreien Download:  http://www.microsoft.com/downloads/detai...&displaylang=en
Tipp: Der XML-Editor von Visual Studio bietet Intellisense und Beschreibungstexte als Tiptext der Tags, wenn man die verwendeten Schemata angibt (Geht über das Fenster "Eigenschaften", Eigenschaft "Schemata").
Außerdem lässt sich sehr leicht herausfinden, wie Excel was in XML darstellt, indem man eine Excel-Mappe mit dem gewünschten Inhalt von Hand erstellt und im XML-Format speichert. Dann muss man sich nur noch das erzeugte XML zu Gemüte führen und schauen, was Excel gemacht hat.

Das Snippet besteht aus einer Klasse mit nur einer statischen Funktion. Diese Exportiert eine beliebige DataTable in ein neues Excel-Dokument.
Es ist nur ein Beispiel und exportiert alle Zellen als Strings. Mit einer Switch-Anweisung an der richtigen Stelle, lässt sich das aber sehr einfach erweitern.

Getestet wurde das Snippet mit .NET 2.0 und Excel 2003 Professional. Es sollte aber auch ohne Probleme mit Excel 2007 funktionieren.

C#-Code:
using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using System.Data;

namespace Rainbird.Examples.SpreadsheetML
{
    /// <summary>
    /// Enthält Hilfsfunktionen zum Erzeugen von Excel-Dateien mit SpreadsheetML.
    /// </summary>
    public class SpreadsheetMLHelper
    {
        /// <summary>
        /// Erzeugt aus einer DataTable ein Excel-XML-Dokument mit SpreadsheetML.
        /// </summary>        
        /// <param name="dataSource">Datenquelle, die in Excel exportiert werden soll</param>
        /// <param name="fileName">Dateiname der Ausgabe-XML-Datei</param>
        public static void ExportDataTableToWorksheet(DataTable dataSource, string fileName)
        {
            // XML-Schreiber erzeugen
            XmlTextWriter writer = new XmlTextWriter(fileName, Encoding.UTF8);

            // Ausgabedatei für bessere Lesbarkeit formatieren (einrücken etc.)
            writer.Formatting = Formatting.Indented;

            // <?xml version="1.0"?>
            writer.WriteStartDocument();

            // <?mso-application progid="Excel.Sheet"?>
            writer.WriteProcessingInstruction("mso-application", "progid=\"Excel.Sheet\"");

            // <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet >"
            writer.WriteStartElement("Workbook", "urn:schemas-microsoft-com:office:spreadsheet");

            // Definition der Namensräume schreiben
            writer.WriteAttributeString("xmlns", "o", null, "urn:schemas-microsoft-com:office:office");
            writer.WriteAttributeString("xmlns", "x", null, "urn:schemas-microsoft-com:office:excel");
            writer.WriteAttributeString("xmlns", "ss", null, "urn:schemas-microsoft-com:office:spreadsheet");
            writer.WriteAttributeString("xmlns", "html", null, "http://www.w3.org/TR/REC-html40");

            // <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
            writer.WriteStartElement("DocumentProperties", "urn:schemas-microsoft-com:office:office");

            // Dokumenteingeschaften schreiben
            writer.WriteElementString("Author", Environment.UserName);
            writer.WriteElementString("LastAuthor", Environment.UserName);
            writer.WriteElementString("Created", DateTime.Now.ToString("u") + "Z");
            writer.WriteElementString("Company", "Unknown");
            writer.WriteElementString("Version", "11.8122");

            // </DocumentProperties>
            writer.WriteEndElement();

            // <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
            writer.WriteStartElement("ExcelWorkbook", "urn:schemas-microsoft-com:office:excel");

            // Arbeitsmappen-Einstellungen schreiben
            writer.WriteElementString("WindowHeight", "13170");
            writer.WriteElementString("WindowWidth", "17580");
            writer.WriteElementString("WindowTopX", "120");
            writer.WriteElementString("WindowTopY", "60");
            writer.WriteElementString("ProtectStructure", "False");
            writer.WriteElementString("ProtectWindows", "False");

            // </ExcelWorkbook>
            writer.WriteEndElement();

            // <Styles>
            writer.WriteStartElement("Styles");

            // <Style ss:ID="Default" ss:Name="Normal">
            writer.WriteStartElement("Style");
            writer.WriteAttributeString("ss", "ID", null, "Default");
            writer.WriteAttributeString("ss", "Name", null, "Normal");

            // <Alignment ss:Vertical="Bottom"/>
            writer.WriteStartElement("Alignment");
            writer.WriteAttributeString("ss", "Vertical", null, "Bottom");
            writer.WriteEndElement();

            // Verbleibende Sytle-Eigenschaften leer schreiben
            writer.WriteElementString("Borders", null);
            writer.WriteElementString("Font", null);
            writer.WriteElementString("Interior", null);
            writer.WriteElementString("NumberFormat", null);
            writer.WriteElementString("Protection", null);

            // </Style>
            writer.WriteEndElement();

            // </Styles>
            writer.WriteEndElement();

            // <Worksheet ss:Name="xxx">
            writer.WriteStartElement("Worksheet");
            writer.WriteAttributeString("ss", "Name", null, dataSource.TableName);

            // <Table ss:ExpandedColumnCount="2" ss:ExpandedRowCount="3" x:FullColumns="1" x:FullRows="1" ss:DefaultColumnWidth="60">
            writer.WriteStartElement("Table");
            writer.WriteAttributeString("ss", "ExpandedColumnCount", null, dataSource.Columns.Count.ToString());
            writer.WriteAttributeString("ss", "ExpandedRowCount", null, dataSource.Rows.Count.ToString());
            writer.WriteAttributeString("x", "FullColumns", null, "1");
            writer.WriteAttributeString("x", "FullRows", null, "1");
            writer.WriteAttributeString("ss", "DefaultColumnWidth", null, "60");

            // Alle Zeilen der Datenquelle durchlaufen
            foreach (DataRow row in dataSource.Rows)
            {
                // <Row>
                writer.WriteStartElement("Row");

                // Alle Zellen der aktuellen Zeile durchlaufen
                foreach (object cellValue in row.ItemArray)
                {
                    // <Cell>
                    writer.WriteStartElement("Cell");

                    // <Data ss:Type="String">xxx</Data>
                    writer.WriteStartElement("Data");
                    writer.WriteAttributeString("ss", "Type", null, "String");

                    // Wenn die Zelle keinem leeren Datenbankwert entspricht ...
                    if (cellValue!=DBNull.Value)
                        // Zelleninhakt schreiben
                        writer.WriteValue(cellValue);

                    // </Data>
                    writer.WriteEndElement();

                    // </Cell>
                    writer.WriteEndElement();
                }
                // </Row>
                writer.WriteEndElement();
            }
            // </Table>
            writer.WriteEndElement();

            // <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
            writer.WriteStartElement("WorksheetOptions", "urn:schemas-microsoft-com:office:excel");

            // Seiteneinstellungen schreiben
            writer.WriteStartElement("PageSetup");
            writer.WriteStartElement("Header");
            writer.WriteAttributeString("x", "Margin", null, "0.4921259845");
            writer.WriteEndElement();
            writer.WriteStartElement("Footer");
            writer.WriteAttributeString("x", "Margin", null, "0.4921259845");
            writer.WriteEndElement();
            writer.WriteStartElement("PageMargins");
            writer.WriteAttributeString("x", "Bottom", null, "0.984251969");
            writer.WriteAttributeString("x", "Left", null, "0.78740157499999996");
            writer.WriteAttributeString("x", "Right", null, "0.78740157499999996");
            writer.WriteAttributeString("x", "Top", null, "0.984251969");
            writer.WriteEndElement();
            writer.WriteEndElement();

            // <Selected/>
            writer.WriteElementString("Selected", null);

            // <Panes>
            writer.WriteStartElement("Panes");

            // <Pane>
            writer.WriteStartElement("Pane");

            // Bereichseigenschaften schreiben
            writer.WriteElementString("Number", "1");
            writer.WriteElementString("ActiveRow", "1");
            writer.WriteElementString("ActiveCol", "1");

            // </Pane>
            writer.WriteEndElement();

            // </Panes>
            writer.WriteEndElement();

            // <ProtectObjects>False</ProtectObjects>
            writer.WriteElementString("ProtectObjects", "False");

            // <ProtectScenarios>False</ProtectScenarios>
            writer.WriteElementString("ProtectScenarios", "False");

            // </WorksheetOptions>
            writer.WriteEndElement();

            // </Worksheet>
            writer.WriteEndElement();

            // </Workbook>
            writer.WriteEndElement();

            // Datei auf Festplatte schreiben
            writer.Flush();
            writer.Close();
        }
    }
}

Schlagwörter: Excel,SpreadsheetML,Export,Exportieren,XML,Office,OLEDB
17.09.2007 22:43 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
falangkinjau
myCSharp.de-Mitglied

Dabei seit: 27.10.2006
Beiträge: 171
Entwicklungsumgebung: Vim/Netbeans
Herkunft: Berlin


falangkinjau ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo,

für die Interessierten dieser Technik möchte ich noch auf die kostenlose Library von  CarlosAg
hinweisen.

Ergänzend zum sehr guten Einstiegsnippet sei noch erwähnt, daß die Stylesheets unabhängig vom Code gehalten werden können und dann mit der Klasse XslTransform aus dem Stylesheet und den Daten, der XML-Datei, die Exceldatei erzeugt werden kann.

Gruß falangkinjau
18.09.2007 09:37 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Rainbird Rainbird ist männlich
myCSharp.de-Poweruser/ Experte

avatar-2834.jpg


Dabei seit: 28.05.2005
Beiträge: 3.723
Entwicklungsumgebung: Visual Studio 2012
Herkunft: Mauer

Themenstarter Thema begonnen von Rainbird

Rainbird ist offline

Super

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Danke für den Hinweis. Super Library!

Damit gehört fehleranfällige und lahme COM-Fernsteuerung zu 90% der Vergangenheit an.
18.09.2007 10:00 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
FZelle
myCSharp.de-Poweruser/ Experte

Dabei seit: 23.04.2004
Beiträge: 9.851


FZelle ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Die hatte ich "vor Jahren" hier auch mal gepostet.

Wenn ihr euch für eine VS.NET Express registrieren lasst, bekommt ihr
auf der Bonus Seite auch eine Lizenz für Spreatsheetgear.
Das solltest Ihr euch auch mal anschauen.
18.09.2007 17:36 Beiträge des Benutzers | zu Buddylist hinzufügen
Rainbird Rainbird ist männlich
myCSharp.de-Poweruser/ Experte

avatar-2834.jpg


Dabei seit: 28.05.2005
Beiträge: 3.723
Entwicklungsumgebung: Visual Studio 2012
Herkunft: Mauer

Themenstarter Thema begonnen von Rainbird

Rainbird ist offline

Suche

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Da hätte ich mal öfter die Forensuche benutzen sollen.

Aber es hat auch ein Gutes. Wenn man etwas ohne Hilfmittel "von Hand" gemacht hat, weiss man wie es wirklich funktioniert.
18.09.2007 19:41 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
FZelle
myCSharp.de-Poweruser/ Experte

Dabei seit: 23.04.2004
Beiträge: 9.851


FZelle ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ist richtig.

Auf codeproject ist auch ein artikel für vor MathML Zeiten, der das per html macht,
denn Excel versteht ja auch html.

Aber hast Du dir mal die Lib von Spreatsheetgear angeschaut?
19.09.2007 09:48 Beiträge des Benutzers | zu Buddylist hinzufügen
Rainbird Rainbird ist männlich
myCSharp.de-Poweruser/ Experte

avatar-2834.jpg


Dabei seit: 28.05.2005
Beiträge: 3.723
Entwicklungsumgebung: Visual Studio 2012
Herkunft: Mauer

Themenstarter Thema begonnen von Rainbird

Rainbird ist offline

SpreadsheetGear

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Noch nicht, aber das werde ich nachholen.
19.09.2007 10:06 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Zwischen diesen beiden Beiträgen liegt mehr als ein Monat.
spidermike
myCSharp.de-Mitglied

Dabei seit: 26.09.2005
Beiträge: 243
Entwicklungsumgebung: VS 2005


spidermike ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

coole sache, genau was ich suche, funktioniert auch perfekt smile

kann mir noch jemand sagen, wie ich die spaltennamen gleich mitexportieren kann?

thnx!
04.11.2007 19:19 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Rainbird Rainbird ist männlich
myCSharp.de-Poweruser/ Experte

avatar-2834.jpg


Dabei seit: 28.05.2005
Beiträge: 3.723
Entwicklungsumgebung: Visual Studio 2012
Herkunft: Mauer

Themenstarter Thema begonnen von Rainbird

Rainbird ist offline

Schleife

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Du machst vor der Schleife für die DataRows einfach eine andere Schleife für die DataColumns und schreibst den ColumnName in die Excel-Zelle (selbes Verfahren).
05.11.2007 07:39 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
spidermike
myCSharp.de-Mitglied

Dabei seit: 26.09.2005
Beiträge: 243
Entwicklungsumgebung: VS 2005


spidermike ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

tjo ich hab nur leider null ahnung von spreadsheetML verwundert
05.11.2007 13:59 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Rainbird Rainbird ist männlich
myCSharp.de-Poweruser/ Experte

avatar-2834.jpg


Dabei seit: 28.05.2005
Beiträge: 3.723
Entwicklungsumgebung: Visual Studio 2012
Herkunft: Mauer

Themenstarter Thema begonnen von Rainbird

Rainbird ist offline

Excel XML Writer

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Wenn Du keine Ahnung hast, dann nimm einfach den Excel XML Writer:  http://www.carlosag.net/Tools/ExcelXmlWriter/Default.aspx

Der kapselt SpreadsheetML in einem intuitiven Objektmodell. Einfacher gehts wirklich nicht mehr.
06.11.2007 00:23 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
spidermike
myCSharp.de-Mitglied

Dabei seit: 26.09.2005
Beiträge: 243
Entwicklungsumgebung: VS 2005


spidermike ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Danke rainbird, werd ich mir auf jeden fall anschaun.

Trotzdem bin ich neugierig und will ja was lernen Augenzwinkern
Vl kannst du mir ja sagen wie es aussehen würde, wenn auch die spaltennamen mitexportiert werden sollen?!
06.11.2007 10:21 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
spidermike
myCSharp.de-Mitglied

Dabei seit: 26.09.2005
Beiträge: 243
Entwicklungsumgebung: VS 2005


spidermike ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

kann mir aber auch jemand anders zeigen, nur keine scheu Augenzwinkern
13.11.2007 15:18 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Zwischen diesen beiden Beiträgen liegen mehr als 4 Monate.
LingLing
myCSharp.de-Mitglied

Dabei seit: 26.02.2008
Beiträge: 10


LingLing ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo,
das snippet ist sher gut, bei mir läuft es fehlerfrei, nur möchte ich noch gerne wissen, wie ich den Pfad der Datei ändere.
Bishher ist die Datei nur im Debug ordner zu finden.
Außerdem möchte ich noch gerne wissen wie ich einzelne Zellen einfärben kann.

MFG LingLing
13.03.2008 08:49 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Khalid Khalid ist männlich
myCSharp.de-Poweruser/ Experte

avatar-2534.gif


Dabei seit: 19.07.2005
Beiträge: 3.507
Entwicklungsumgebung: Visual Studio 15/17
Herkunft: Hannover


Khalid ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo LingLing,

Zitat:
nur möchte ich noch gerne wissen, wie ich den Pfad der Datei ändere

Die Methode hat doch ein fileName-Parameter!? Da kannst du den Pfad mit übergeben. Und wegen den einfärben von Zellen, empfehle ich dir in die Spezifikationen von OpenXml zu schauen. Ist gar nicht so schwer.
13.03.2008 08:56 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Zwischen diesen beiden Beiträgen liegen mehr als 3 Monate.
WSX WSX ist männlich
myCSharp.de-Mitglied

Dabei seit: 12.09.2007
Beiträge: 32


WSX ist offline

Formatprobleme

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hi, der Thread ist doch schon etwas älter aber ich versuch es einfach einmal,
ich muss sagen diese Dll ist einfach Weltklasse und hat bis jetzt ihre zweck bei mir für eine einfache Ausgabe sehr gut erfüllt, wollte jetzt auch noch zusätzlich Rechnungsanhänge für Kunden generieren, in der einfachen Ausgabe funktionierts auch super, nur wenn ich mit WorksheetStyle arbeiten will, scheint das Programm diese auch zu generieren, aber wenn ich die generierten Files in Excel öffnen will bekomme ich einen Hinweis das es Probleme beim laden hab.
Vielleicht hat jemand von euch schon Erfahrung mit Styles hier

so erstelle ich styles

C#-Code:
WorksheetStyle sozds = book.Styles.Add("dsoberezeile";);
sozds.Font.Bold = false;
sozds.Font.FontName = "Verdana";
sozds.Font.Size = 10;

so wende ich diese auf cellen an

C#-Code:
row.Cells.Add(my.dr["Frachtbriefnummer"].ToString(), DataType.String, "dsoberezeile";);

wäre echt hilfreich, Vielen Dank im Voraus!
17.06.2008 16:07 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 13 Jahre.
Der letzte Beitrag ist älter als 12 Jahre.
Antwort erstellen


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 18.09.2020 21:16