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

Ein Excel-Sheet am Server generieren und zum Client schicken

Geschrieben von: Christian Holm
Kategorie: ASP Tricks

This printed page brought to you by AlphaSierraPapa

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.

This printed page brought to you by AlphaSierraPapa

Download des Codes

Klicken Sie hier, um den Download zu starten.
http://www.aspheute.com/code/20010305.zip

Verwandte Artikel

Dateien zum Client schicken
http:/www.aspheute.com/artikel/20010223.htm
Die SA Excel Writer Komponente
http:/www.aspheute.com/artikel/20001204.htm
Ein Excel-Diagramm am Server generieren und zum Client schicken
http:/www.aspheute.com/artikel/20010307.htm
Excel Dateien ohne Excel anzeigen
http:/www.aspheute.com/artikel/20001110.htm
Excel Diagramme als GIF's serven
http:/www.aspheute.com/artikel/20010309.htm
Mit ASP ein Word Dokument am Server generieren
http:/www.aspheute.com/artikel/20010319.htm
SA ExcelWriter in Action
http:/www.aspheute.com/artikel/20001207.htm
Serverdaten clientseitig in Exceltemplates importieren
http:/www.aspheute.com/artikel/20020128.htm

Links zu anderen Sites

AlphaSierraPapa
http://www.alphasierrapapa.com/
FileCache 2.1 Komponente
http://www.alphasierrapapa.com/IisDev/Components/FileCache/
PRB: Cannot Launch Out of Process Component Under IIS 4
http://support.microsoft.com/support/kb/articles/Q184/6/82.ASP

 

©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.