Glengamoi (Forum) · AspHeute · .NET Heute (RSS-Suche) · AspxFiles (Wiki) · .NET Blogs
ASP German Homepage Homepage
 

Liste

.NET 2.0 (1)
.NET Allgemein (16)
.NET Fu (5)
ADO.NET (11)
Aprilscherz (3)
ASP Grundlagen (44)
ASP Tricks (83)
ASP.NET (44)
ASPIntranet.de (5)
C# (28)
Datenbank (44)
Dokumentation (4)
IIS 6.0 (1)
Komponenten (29)
Optimierung (10)
Server (21)
Sicherheit (34)
Tee Off (6)
VB.NET (6)
WAP (8)
Web Services (11)
XML (9)

RSS 2.0 - Die neuesten fünf Artikel auf AspHeute.com


 

Suchen





 

English Articles
Chinese Articles
Unsere Autoren
 
Link zu AspHeute
Impressum
Werben
Anfragen

Ein Excel-Sheet am Server generieren und zum Client schicken

Geschrieben von: Christian Holm
Kategorie: ASP Tricks

Im heutigen Artikel erfahren Sie, wie man ein Microsoft Excel SpreadSheet auf einem Server programmatisch generiert, und dann bequem - ohne es im Browser öffnen zu müssen - zum Client schickt. Um das Beispiel etwas praxisnäher zu gestalten, werden die Daten die das SpreadSheet später enthalten soll, mit einer Datenbankabfrage geholt.

Vorbereitungen

Um dieses Beispiel ausprobieren zu können benötigen Sie Windows NT oder Windows 2000, einen Web Server (IIS Version 4 oder Version 5) und Microsoft Excel für die Objekterstellung während der Dateigenerierung.

Hinweis: Diejenigen, die den IIS 4 verwenden, müssen zuerst noch den Webserver so konfigurieren, daß er Out-Of-Process Komponenten bzw. Applikationen starten kann. Anderenfalls erhalten Sie während dem Ablauf des Beispiel Scriptes in der Zeile, in der mit Hilfe von Server.CreateObject das Excel Application Objekt erstellt wird, eine Fehlermeldung.

Um dies zu vermeiden müssen Sie daher die IIS Metabase verändern. Eine Anleitung zur Durchführung finden Sie hier auf der Microsoft Online Support Seite.

Im IIS 5 ist das Starten von EXE COM Komponenten standardmäßig erlaubt. Wie schon erwähnt ist es eine Voraussetzung, daß Microsoft Excel am Server installiert ist. Ansonsten schlägt die Erstellung des Objekts fehl, und man erhält folgende Fehlermeldung:

Ein weiteres potentielles Problem: Da das Script die generierte Excel-Datei in einen Serverpfad schreibt, müssen die entsprechenden Permissions gesetzt werden. Andernfalls erhalten Sie einen solchen Fehler:

Die Schreibpermissions setzen Sie im jeweiligen Verzeichnis wo sich das Script befindet oder in welches Verzeichnis die generierte Excel-Datei geschrieben werden soll. Nun, da die Grundvoraussetzungen hiermit erbracht wurden, können wir mit dem Beispielsourcecode anfangen.

Die Aufgabe und Lösung

Es soll ein Excel SpreadSheet am Server unter Verwendung von ASP genieriert werden. Ich habe hierfür einfach eine fiktive Übersicht aus den Gewinnen verschiedener Produkte genommen. Da es eine kleine Firma mit nur wenigen Produkten ist, sind die Gewinne der einzelnen Produkte auch in einer Microsoft Access Datenbank gespeichert. Der Einfachheit halber besteht diese Datenbank nur aus einem Feld für Primärschlüssel (für dieses Beispiel unerheblich), eines für den Produktnamen (ProductName) und eines für den Einzelgewinn (ProductIncome) des Produktes.

Die Tabelle der Access Datenbank, welche die Daten enthalten soll sieht dabei so aus:

Nach der Erstellung der Tabellenstruktur habe ich nun die Datentabelle mit fiktiven Werten befüllt:

Mit ASP werden wir diese Daten auslesen und in ein Excel SpreadSheet verfrachten. Um einen Web Browser daran zu hindern, daß nach der Fertigstellung der Excel-Datei Excel geöffnet wird, verwende ich die FileCache 2.1 Komponente von AlphaSierraPapa.com um die Datei zum Client zu schicken. Dieser kann sie dann bequem lokal abspeichert und weiterverwenden.

Sehen wir uns nun den Sourcecode näher an (GenXlsSample.asp):

Das SpreadSheet generieren

Set xlApp = Server.CreateObject("Excel.Application")
Set xlBook = xlApp.Workbooks.Add
Set xlSheet = xlBook.Worksheets(1)

Zuerst instanzieren wir das Excel Application Objekt. Danach erstellen wir darin ein "Workbook" (Arbeitsmappe) und fügen dem Workbook ein SpreadSheet hinzu. Damit die Microsoft Excel Applikation dabei nicht sichtbar wird, setzen wir:

xlApp.Application.Visible = False

Um ein paar optische Aufbesserungen durchzuführen, formatieren wir die Überschrift des SpreadSheets:

With xlApp.ActiveSheet.Cells(1,1)
	.Value = "Overall Product Sales 2000"
	.Font.Bold = True
	.Font.Name = "Tahoma"
	.Font.Size = 16
End With

Zusätzlich formatiern wir auch noch die Spaltenüberschriften:

With xlApp.ActiveSheet.Cells(3,1)
	.Value = "Product Name"
	.Font.Italic = True
	.Font.Name = "Tahoma"
	.Font.Size = 13
	.MergeCells = True
End With

With xlApp.ActiveSheet.Cells(3,2)
	.Value = "Product Income"
	.Font.Italic = True
	.Font.Name = "Tahoma"
	.Font.Size = 13
	.MergeCells = True
End With

Die Access Datenbank Abfrage

Da wir die erforderlichen aus der Datenbank holen möchten, ist wie immer der folgende Sourcecode notwendig:

Set objConn = Server.CreateObject("ADODB.Connection")
Set objRS = Server.CreateObject("ADODB.Recordset") 

strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
strConn = strConn & Server.MapPath("Sales00.mdb") 
strQuery = "SELECT ProductName,ProductIncome FROM ProductSales"

Nun können wir die benötigten Daten aus der Datenbank holen, indem wir mit Hilfe des RecordSet Objektes durch die einzelnen Datenreihen iterieren:

While Not objRS.EOF
  xlApp.ActiveSheet.Cells(iRow,1).Value = objRS("ProductName")
  xlApp.ActiveSheet.Cells(iRow,2).Value = objRS("ProductIncome")
  xlApp.ActiveSheet.Cells(iRow,2).NumberFormat = "$#,##0.00"
  iRow = iRow + 1
  objRS.MoveNext
Wend

Da nun die Daten im Excel SpreadSheet abgelegt sind, können wir die Datei am Web Server speichern:

xlSheet.SaveAs Server.MapPath(strFileName)

Jetzt ist es Zeit, Excel zu schließen und die benötigten Resourcen wieder freizugeben:

xlApp.Application.Quit

objRS.Close
objConn.Close
Set objRS = Nothing
Set objConn = Nothing
Set xlSheet = Nothing
Set xlBook = Nothing
Set xlApp = Nothing

Senden der Datei zum Client

Das Excel SpreadSheet ist nun fertig. Was jetzt noch fehlt ist die Versendung zum Client. Wie eingangs erwähnt, habe ich um dies zu erledigen die FileCache Komponente verwendet. Diese ist einfach zu verwenden und der benötigte Sourcecode ist schnell geschrieben:

Set objFileCache = Server.CreateObject("Softwing.FileCache.1")
bXlsFile = objFileCache.InitFromFile(strFileName, False)
objFileCache.MimeType = "application/octet-stream"
bXlsFile = objFileCache.Write()

Response.End

Hier erhält der Client nun einen Speichern als Dialog und kann die Datei lokal abspeichern. Wenn man nun die erstellte Excel Datei in Excel öffnet, erhält man das gewünschte Resultat:

Schlußbemerkung

Dies war ein einfaches Beispiel zur Generierung eines Excel SpreadSheets mit ASP unter zusätzlicher Verwendung einer Datenbankabfrage. Der präsentierte Beispiel Sourcecode ist natürlich erweiterbar. Man könnte z.B. mit den Office Web Components die gewonnenen Daten aus der Datenbank in einem Diagramm visualisiern - aber das ist eine andere Geschichte.

Download des Codes

Klicken Sie hier, um den Download zu starten.

Verwandte Artikel

Dateien zum Client schicken
Die SA Excel Writer Komponente
Ein Excel-Diagramm am Server generieren und zum Client schicken
Excel Dateien ohne Excel anzeigen
Excel Diagramme als GIF's serven
Mit ASP ein Word Dokument am Server generieren
SA ExcelWriter in Action
Serverdaten clientseitig in Exceltemplates importieren

Links zu anderen Sites

AlphaSierraPapa
FileCache 2.1 Komponente
PRB: Cannot Launch Out of Process Component Under IIS 4

Wenn Sie jetzt Fragen haben...

Wenn Sie Fragen rund um die in diesem Artikel vorgestellte Technologie haben, dann schauen Sie einfach bei uns in den Community Foren der deutschen .NET Community vorbei. Die Teilnehmer helfen Ihnen gerne, wenn Sie sich zur im Artikel vorgestellten Technologie weiterbilden möchten.

Haben Sie Fragen die sich direkt auf den Inhalt des Artikels beziehen, dann schreiben Sie dem Autor! Unsere Autoren freuen sich über Feedback zu ihren Artikeln. Ein einfacher Klick auf die Autor kontaktieren Schaltfläche (weiter unten) und schon haben Sie ein für diesen Artikel personalisiertes Anfrageformular.

 

Und zu guter Letzt möchten wir Sie bitten, den Artikel zu bewerten. Damit helfen Sie uns, die Qualität der Artikel zu verbessern - und anderen Lesern bei der Auswahl der Artikel, die sie lesen sollten.

Bewerten Sie diesen Artikel
 Sehr gut   Nicht genügend  
   1  2  3  4  5  
 

  
   Für Ausdruck optimierte Seite

©2000-2006 AspHeute.com
Alle Rechte vorbehalten. Der Inhalt dieser Seiten ist urheberrechtlich geschützt.
Eine Übernahme von Texten (auch nur auszugsweise) oder Graphiken bedarf unserer schriftlichen Zustimmung.