Ein Excel-Sheet am Server generieren und zum Client schicken
Geschrieben von: Christian Holm 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. VorbereitungenUm 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ösungEs 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 generierenSet 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 AbfrageDa 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 ClientDas 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ßbemerkungDies 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 CodesKlicken Sie hier, um den Download zu starten. Verwandte Artikel
Dateien zum Client schicken Links zu anderen Sites
AlphaSierraPapa 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.
©2000-2006 AspHeute.com |