Windows Azure Cloud Storage ermöglicht es Ihnen bereits ab 0,10€ pro GB/Monat die Vorteile der Cloud zu nutzen.
Willkommen bei dotnet-snippets.de! Snippet hinzufügen Login Registrieren
Snippets in der Datenbank: 1551 | Anzahl registrierter User: 1841 | Besucher online: 316
Hauptmenü
Home
Top Ten
Zufälliger Snippet
FAQs
.NET Community
dotnet-forum.de
dotnet-kicks.de
Social

RSS Feeds
Rss Alle Snippets
Rss C#
Rss VB.NET
Rss C++
Rss ASP.NET
Partner
Member of Microsoft Community Leader/Insider Program (CLIP)

Excel: DataTable mittels OLEDB in Excel-Dokument exportieren


Autor: Rainbird
Sprache: C#
Bewertung:
8.76 (12 votes)
Anzahl der Aufrufe: 35028
  
Kick it on dotnet-kicks.de  

Beschreibung:

Dieses Snippet erzeugt aus einer gewöhnlichen DataTable ein neues Excel-Dokument. Die Excel-Zellen werden mit OLEDB-Datenzugriff gefüllt (Also wesentlich schneller als COM-Automatisierung). Das Snippet sollte ab Excel 97 oder höher laufen. Getestet wurde es mit Excel 2000.

Abgelegt unter: Excel, Export, exportieren, OLEDB, DataTable, ADO.NET.



C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.OleDb;
using System.Runtime.Remoting;
using System.Reflection;
using System.Runtime.InteropServices;

namespace Rainbird.Examples.Office.Excel.OLEDBAccess
{
    /// <summary>
    /// Exportiert den Inhalt einer DataTable in ein neues Excel-Dokument.
    /// </summary>
    public class ExcelExport
    {
        /// <summary>
        /// Privater Standardkonstruktor.
        /// </summary>
        private ExcelExport() { }

        /// <summary>
        /// Schreibt das Schema einer bestimmten Tabelle in eine neue Excel-Datei.
        /// </summary>
        /// <param name="table">Tabelle</param>
        /// <param name="fileName">Dateiname</param>
        public static void WriteTableSchemaToExcelFile(DataTable table, string fileName)
        {
            // Excel im Hintergrund öffnen
            object excel = Activator.CreateInstance(Type.GetTypeFromProgID("Excel.Application"));

            // Auflistung der Mappeen abrufen
            object books = excel.GetType().InvokeMember("Workbooks", BindingFlags.IgnoreCase | BindingFlags.GetProperty | BindingFlags.OptionalParamBinding, null, excel, new object[0]);

            // Neue Mappe erstellen
            object book = books.GetType().InvokeMember("Add", BindingFlags.InvokeMethod | BindingFlags.OptionalParamBinding, null, books, new object[0]);

            // Auflistung der Tabellenblätter abrufen
            object sheets = book.GetType().InvokeMember("Sheets", BindingFlags.IgnoreCase | BindingFlags.GetProperty | BindingFlags.OptionalParamBinding, null, book, new object[0]);

            // Neues Tabellenblatt erstellen
            object sheet = sheets.GetType().InvokeMember("Add", BindingFlags.InvokeMethod | BindingFlags.OptionalParamBinding, null, sheets, new object[0]);

            // Name des Tabellenblatts festlegen
            sheet.GetType().InvokeMember("Name", BindingFlags.SetProperty, null, sheet, new object[1] { table.TableName });

            // Zähler
            int i = 0;

            // Spalten der Tabelle durchlaufen
            foreach (DataColumn column in table.Columns)
            {
                // Zähler erhöhen
                i++;

                // Feldnamen einfügen
                object range = sheet.GetType().InvokeMember("Cells", BindingFlags.GetProperty | BindingFlags.OptionalParamBinding, null, sheet, new object[2] { 1, i });
                range.GetType().InvokeMember("Value", BindingFlags.SetProperty | BindingFlags.OptionalParamBinding, null, range, new object[1] { column.ColumnName });
            }

            // Dokument speichern
            book.GetType().InvokeMember("SaveAs", BindingFlags.InvokeMethod | BindingFlags.OptionalParamBinding, null, book, new object[1] { fileName });

            // COM-Verweise freigeben
            Marshal.ReleaseComObject(sheet);
            Marshal.ReleaseComObject(sheets);
            Marshal.ReleaseComObject(book);
            Marshal.ReleaseComObject(books);

            // Excel schließen
            excel.GetType().InvokeMember("Quit", BindingFlags.InvokeMethod, null, excel, new object[0]);

            // Excel.Application COM-Verweis freigeben
            Marshal.ReleaseComObject(excel);
        }

        /// <summary>
        /// Erzeugt eine OLEDB-Verbindungszeichenfolge für ein bestimmtes Excel-Dokument.
        /// </summary>
        /// <param name="fileName">Dateiname (.XLS)</param>
        /// <returns>Verbindungszeichenfolge</returns>
        private static string BuidExcelConnectionString(string fileName)
        {
            // Verbindungszeichenfolge erzeugen un zurückgeben
            return "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fileName + ";Extended Properties=Excel 8.0";
        }

        /// <summary>
        /// Erzeugt aus einer Tabelle ein Excel-Dokument.
        /// </summary>
        /// <param name="table">Tabelle</param>
        /// <param name="fileName">Dateiname des Ziel-Excel-Dokuments</param>
        public static void FillExcelSheet(DataTable table, string fileName)
        {
            // Neue leere Excel-Datei aus dem Tabellenschema erzeugen
            WriteTableSchemaToExcelFile(table, fileName);

            // Verbindungszeichenfolge erzeugen
            string connectionString = BuidExcelConnectionString(fileName);

            // Neue OLEDB-Verbindung erzeugen
            OleDbConnection connection = new OleDbConnection(connectionString);
            connection.Open();

            // String-Generator für Parameter erzeugen
            StringBuilder parameterBuilder = new StringBuilder(") VALUES (");

            // Spalten zählen
            int columnCount=table.Columns.Count;

            // INSERT SQL-Anweisung für Excel erzeugen
            StringBuilder builder = new StringBuilder("INSERT INTO [");
            builder.Append(table.TableName);
            builder.Append("$] (");

            // Alle Spalten durchlaufen
            for (int i = 0; i < columnCount; i++)
            {
                // Spaltennamen anfügen
                builder.Append(table.Columns[i].ColumnName);

                // Parameter anfügen
                parameterBuilder.Append("?");

                // Wenn eine weitere Spalte folgt ...
                if (i < (columnCount - 1))
                {
                    // Kommas anfügen
                    builder.Append(",");
                    parameterBuilder.Append(",");
                }
            }
            // SQL-Anweisung fertigstellen
            builder.Append(parameterBuilder.ToString());
            builder.Append(")");
            string insertStatement = builder.ToString();
            
            // Preisliste durchlaufen
            foreach (DataRow row in table.Rows)
            {
                // Neuen OLEDB-Befehl erzeugen
                OleDbCommand command = new OleDbCommand(insertStatement, connection);

                // Alle Spalten durchlaufen
                foreach(DataColumn column in table.Columns)
                {
                    // Parameter übergeben                    
                    command.Parameters.Add(new OleDbParameter(column.ColumnName,row[column]));
                }
                // Befehl ausführen
                command.ExecuteNonQuery();
            }
            // Verbindung schließen
            connection.Close();
        }
    }
}

Sie haben Fragen zu diesem Snippet oder brauchen Hilfe bei der .NET Entwicklung?
Freundliche und kompetente Entwickler helfen Ihnen gern weiter im Forum für .NET Entwicklung.



Kommentare:
(Zum Schreiben von Kommentaren bitte anmelden.)

tomtom62 schrieb am:  25.10.2006 10:07:47

Ich hätte zumindest eine 9 gegeben, bin aber unsicher, weil keine Fehlerbehandlung implementiert ist. Zumindest einen Rückgabewert hätte ich mir gewünscht.
regalis schrieb am:  12.03.2010 18:00:32

Mit Excel 2007 und VS2008 Pro funktioniert das Snippet leider nicht mehr...
Es wirft eine Exception bei Zeile 151 (Also irgendwas scheint an dem Command nicht zu stimmen :( )
regalis schrieb am:  21.03.2010 16:30:39

Kann jemand vielleicht einen Workaround posten damit die Funktionalität wieder hergestellt ist?
Denn grundsätzlich gefällt mir das Snippet sehr gut...bis eben auf die Exception...
Wäre nett :)
Mario Noack schrieb am:  23.03.2010 11:54:17

Kann es sein, dass das Problem nur 64Bit ist... Lasst es mal als 32Bit laufen, die Jet-Treiber dürften als 64Bit nicht verfügbar sein.
regalis schrieb am:  23.03.2010 17:31:53

Das wäre ne Möglichkeit!
XNA läuft auch nicht als 64bit Anwendung..werde dies mal bei Gelegenheit ausprobieren.
Vielen Dank für den Tipp :)
regalis schrieb am:  23.03.2010 17:52:32

Also ich bekomme diese Fehlermeldung: Die externe Tabelle hat nicht das erwartete Format.
Ich habe in meiner Tabelle nur Strings...0o

[quote]************** Ausnahmetext **************
System.Data.OleDb.OleDbException: Die externe Tabelle hat nicht das erwartete Format.
bei System.Data.OleDb.OleDbConnectionInternal..ctor(OleDbConnectionString constr, OleDbConnection connection)
bei System.Data.OleDb.OleDbConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningObject)
bei System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection, DbConnectionPoolGroup poolGroup)
bei System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
bei System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
bei System.Data.OleDb.OleDbConnection.Open()
bei FilmDBExtractor.ExcelExport2.FillExcelSheet(DataTable table, String fileName) in C:\Users\regalis\Documents\Visual Studio 2008\Projects\FilmDBExtractor\FilmDBExtractor\ExcelExport.cs:Zeile 295.
bei FilmDBExtractor.Form1.ExportMoviesToExcel() in C:\Users\regalis\Documents\Visual Studio 2008\Projects\FilmDBExtractor\FilmDBExtractor\Form1.cs:Zeile 1090.
bei FilmDBExtractor.Form1.excelsheetErzeugenToolStripMenuItem_Click(Object sender, EventArgs e) in C:\Users\regalis\Documents\Visual Studio 2008\Projects\FilmDBExtractor\FilmDBExtractor\Form1.cs:Zeile 607.
bei System.Windows.Forms.ToolStripItem.RaiseEvent(Object key, EventArgs e)
bei System.Windows.Forms.ToolStripMenuItem.OnClick(EventArgs e)
bei System.Windows.Forms.ToolStripItem.HandleClick(EventArgs e)
bei System.Windows.Forms.ToolStripItem.HandleMouseUp(MouseEventArgs e)
bei System.Windows.Forms.ToolStripItem.FireEventInteractive(EventArgs e, ToolStripItemEventType met)
bei System.Windows.Forms.ToolStripItem.FireEvent(EventArgs e, ToolStripItemEventType met)
bei System.Windows.Forms.ToolStrip.OnMouseUp(MouseEventArgs mea)
bei System.Windows.Forms.ToolStripDropDown.OnMouseUp(MouseEventArgs mea)
bei System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
bei System.Windows.Forms.Control.WndProc(Message& m)
bei System.Windows.Forms.ScrollableControl.WndProc(Message& m)
bei System.Windows.Forms.ToolStrip.WndProc(Message& m)
bei System.Windows.Forms.ToolStripDropDown.WndProc(Message& m)
bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
bei System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)[/quote]
Nob schrieb am:  16.06.2010 15:38:05

Ich hatte das gleiche Problem: "Die externe Tabelle hat nicht das erwartete Format."
Die Lösung findet man hier:
http://www.codeproject.com/KB/office/JetOledbAndExcel.aspx


Diese Snippets könnten für Sie interessant sein:
[VB.NET] Excelzelle auslesen mit vb.net
[VB.NET] Excel auslesen und in Word einfügen
[VB.NET] ASP.Net Gridview to Excel
[C#] SQL Server Daten in Exel-Datei exportieren mit LINQ
[VB.NET] Excel Prozess schließen
[C#] Excel Prozess schließen (Original von Andy Nikolov)
[C#] Integer nach Excel Spalten Bezeichnung
[C#] Excel Spalten Bezeichnung nach Integer
[C#] Listview in Excel Sheet exportieren
[C#] Einlesen der im Excel-File vorhandenen Worksheets
[C#] Laufende COM-Objekte abfragen
[ASP.net] GridView Excel Export
[C#] Excel-Export ohne Excel (auch für Web)
[C#] Excel: alle Tabellen über OleDb in DataSet lesen
[C#] Spaltennamen eines Arbeitsblatts einer Excel-Datei auslesen
[C#] Namen der Woksheets einer Excel-Datei auslesen
[C#] Excel mit COM Interop auslesen
[C#] TreeView Export To Xml OR Import from XMl
[C#] Datenupdate mittels OleDbCommandBuilder
[C#] ComboBox mit Inhalten aus Datenbank füllen
[C#] Outlook: Via OLEDB schnell auf Outlook-Daten zugreifen
[VB.NET] Mini-Sql-Command-Generator
[C#] alle Tabellennamen einer Datenbank abfragen
[C#] Connection-String Dialog öffnen
[ASP.net] Dataset nur zum Teil im Gridview anzeigen
[C#] Methode CheckMaxLength() als Ereignis für DataTable
[C#] Pivot-Tabelle erstellen
[C#] CSV und XML-Datei Datenbank-Import (incl. valid-check)
[C#] XML in DataTable laden
[VB.NET] Convert DataGridViewRow nach DataRow
[VB.NET] Convert DataGridViewRow nach Objekt-Typ
[C#] CSV Datei in DataTable einlesen
[C#] DataTable in CSV Datei speichern
[C#] CSV Datei in Datatable einlesen
[C#] doppelte Zeilen aus DataTable löschen
[C#] Prüfen ob eine Spalte in einer Datatable existiert
[C#] Zufällige Row aus DataTable
[C#] LINQ-Ergebnis in DataTable kopieren
[VB.NET] DataTable: schnelle Erstellung eines DataRow-Objekts
[C#] ASP.NET AJAX - Daten aus ADO.NET Data Services nutzen
[C#] Code-Bibliothek mit ADO.NET
[C#] ADO.NET Data Services mit einer Oracle-Datenbank
[C#] Eine Website zum Editieren von Datenbankinhalten erstellen

schlecht sehr gut
1 2 3 4 5 6 7 8 9 10
Nur angemeldete User können Snippets bewerten.