Geschrieben von: Herbert Hahn
Kategorie: ASP Tricks
This printed page brought to you by AlphaSierraPapa
Was soll der Anwendungsfall sein, ein Exceltemplate vom Server downzuloaden und dann am Client mit Daten die am Server generiert wurden zu befüllen?. Nun, ganz einfach: es ist wahrscheinlicher, daß am Client Excel installiert ist als am Server! Dies ist besonders bei Providern der Fall, und so umgeht man das Problem ganz elegant mit einem clientseitigen Script, das dann auch noch die ganze Arbeit übernimmt und den Server selbst nicht belastet (mit Excel-Prozessen).
Ich bin in meinem Beispiel davon ausgegangen, daß ich eine Adressenliste aus einer Datenbank in ein Excelfile bringen will. Da ich jedoch die Möglichkeit ausschließe daß am Server dieser Task erledigt werden kann, erzeuge ich einfach mit Response.Write dynamisch ein clientseitiges Script, das der User mittels Downloadlink aktiviert.
Dieses Script ruft dann meine Excelvorlage vom Server ab, und schreibt mir die Felder aus der Datenbankabfrage in die Vorlage hinein. Auf der Clientseite brauche ich die Arbeitsmappe nur mehr abzuspeichern oder auszudrucken.
Sinn und Zweck dieser Übung ist es dem Client ein Excelfile zur Verfügung zu stellen, das zum Zeitpunkt des Abrufens aktuell ist. Möglich wären zum Beispiel aktuelle Umsatzzahlen, oder die via Site gesammelten Adressdaten so aufzubereiten, daß der Besitzer der Site (der ja nicht immer technisch auf dem Stand des Siteprogrammieres ist) aus dieser Liste spielend ein Massenmail oder einen Serienbrief gestalten kann. Natürlich ist die Liste der Anwendungsmöglichkeiten für das dynamische Exceldateien-generieren weitaus länger.
Wie auch beim Wordfiles richtig öffnen! Beispiel betten wir das clientseitige Script in die Downloadseite ein. Dort kann man dann die Links dynamisch generieren (zB wenn die Dokumente in der Datenbank verwaltet werden) oder einfach die klassische Variante eines statischen Links einsetzen.
An dieser Stelle sei noch dazu gesagt, daß man aus der Programmlogik heraus einige Sachen anstellen kann. Zum Beispiel kann man hier ganz einfach das aktuelle Datum in die Tabelle hineinschreiben, oder die Formatierung der Zellen ergebnisgesteuert ändern. Denkbar wäre daß man jede zweite Zeile leicht grau färbt - die Liste ist beliebig erweiterbar.
Nochmals zur Erinnerung vom letzten Artikel: die Pfadangaben sollten unbedingt stimmen. Sonst produziert man möglicherweise sehr viele ungenutzte Excel-Prozesse im Speicher des Clients.
Das folgende Codebeispiel (ex3.asp) stammt aus einem meiner Projekte:
<% Sub OpenDB (ByRef con, d) DB = d & ".mdb" Dir = Request.ServerVariables("SCRIPT_NAME") Dir = StrReverse(Dir) Dir = Mid(Dir, InStr(1, Dir, "/")) Dir = StrReverse(Dir) Path = Server.MapPath(Dir) & "\" DSN = "DRIVER=Microsoft Access Driver (*.mdb);UID=admin;ReadOnly=0;" &_ "UserCommitSync=Yes;Threads=3;SafeTransactions=0;PageTimeout=5;" &_ "MaxScanRows=8;MaxBufferSize=512;ImplicitCommitSync=Yes;" &_ "FIL=MS Access;DriverId=25" & ";DefaultDir=" & Path & ";DBQ=" &_ Path & DB & ";" Set con = Server.CreateObject("ADODB.Connection") con.Open DSN End Sub
Im Kopf der Datei habe ich eine Subroutine angelegt, die mir die Adressendatenbank (Access) öffnet. Diese Routine ist alleine schon sehr brauchbar. Die Datenbank liegt jedoch im gleichen Pfad wie das Script, möglicherweise muß man die Datenbank aber je nach Provider in andere Verzeichnisse ablegen, falls das Skriptverzeichnis schreibgeschützt ist.
Pfad = "\\Sw1\www\softwing\excel\" xlt="meinFile.xlt" url1 = pfad & xlt
Hier baue ich mir den Pfad zur Excel Vorlage zusammen: Die Variable Pfad hält den gesamten Pfad der Datei, exklusive Filenamen. Das sähe also für einen Intranetserver so aus:
\\Server\Freigabe\Pfad\
oder bei eingemappten Laufwerken so:
H:\Pfad\PFAD\
Die Vorlage für unser Vorhaben ist in der Variable xlt gespeichert.
'oeffne die mdb OpenDB con, "exceltest" SQL = "SELECT * FROM Adressen" Set rs = con.Execute(SQL)
Nun öffne ich mittels der Subroutine OpenDB die Testdatenbank, und hole mir meine Testdaten. Nun kommt etwas notwendige HTML-Kosmetik:
%> <html> <head> <title>Excel</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> </head> <body bgcolor="#FFFFFF" text="#000000">
Ab nun schreiben wir das Script zum Client. Wenn man die Sicherheitseinstellungen nicht richtig gesetzt hat, erscheint nur eine Fehlermeldung für dieses Skript. Wie man die notwendigen Einstellungen vornimmt, lesen Sie im Artikel Wordfiles richtig öffnen!.
<script Language=VBScript> <!-- function load_excel(pfad) Set objXL = CreateObject("Excel.Application") objXL.Visible = TRUE objXL.WorkBooks.Open(pfad) objXL.Cells(1, 3).font.bold = true objXL.Cells(1, 2).Value = "Vorname" objXL.Cells(1, 3).Value = "Nachname" objXL.Cells(1, 4).Value = "Strasse" objXL.Cells(1, 5).Value = "Plz" objXL.Cells(1, 6).Value = "Ort" objXL.Cells(1, 7).Value = "Telefon"
Noch ist nichts mit dynamischem Skript, das ist alles vorgegeben. Hier schreiben wir die Spaltenüberschriften, und formatieren den Spaltenkopf von "Nachname" fett. Im Prinzip kann man das je nach Wünschen des Kunden gestalten. Aber nun zum interessanteren Teil:
<% i=3 While Not rs.EOF Reponse.Write " objXL.Cells(" & i & ", 3).font.bold = true" & vbCrLF Reponse.Write " objXL.Cells(" & i & ", 1).Value =" & i & vbCrLF
Wir formatieren den ersten Nachnamen fett, und schon folgt das erste Datenfeld. Wenn Sie sich jetzt fragen wofür denn das abschließende vbCrLf gebraucht wird: Im Clientscript ist das vbCrLf das Ende der Zeile und somit der "Trenner" der Befehle.
Der Befehl für das Befüllen einer Excelzelle lautet (etwas verkürzt):
objXL.Cells(offset der Zeile, offset der Spalte).Value = "Inhalt"
Und das machen wir dann bis uns die Daten ausgehen:
Reponse.Write " objXL.Cells(" & i & ", 2).Value =""" &_ Trim(rs("fldVorname")) & """" & vbCrLF Reponse.Write " objXL.Cells(" & i & ", 3).Value =""" &_ Trim(rs("fldNachname")) & """" & vbCrLF Reponse.Write " objXL.Cells(" & i & ", 4).Value =""" &_ Trim(rs("fldStrasse")) & """" & vbCrLF Reponse.Write " objXL.Cells(" & i & ", 5).Value =""" &_ Trim(rs("fldPlz")) & """" & vbCrLF Reponse.Write " objXL.Cells(" & i & ", 6).Value =""" &_ Trim(rs("fldOrt")) & """" & vbCrLF Reponse.Write " objXL.Cells(" & i & ", 7).Value =""" &_ Trim(rs("fldTelefon")) & """" & vbCrLF i=i+1 rs.MoveNext Wend rs.Close
Serverseitig wird die Datenbank geschlossen, und für das clientseitige Script schließen wir das Excelobjekt:
%> Set objXL = Nothing end function --> </script>
Jetzt müssen wir noch das Script aufrufen:
<table width="100%" border="1" cellspacing="0" cellpadding="0"> <tr> <td width="10%">Excel Demo</td> <td width="42%">1. Excel Vorlage (XLT): Arbeitsmappe generieren.</td> <td width="48%"> <input type=image onClick="load_excel '\\Sw1\www\softwing\excel\meinFile.xlt'" src="./disk.gif" name="image"> </td> </tr> </table> </body> </html>
Im Ereignis onClick rufen wir das clientseitige Script auf. Excel läßt sich nun öffnen und es werden Dokumente als Arbeitsmappe mit der angegebenen Vorlage als "Mappe1" erstellt. Und damit ist unser Problem gelöst.
Zur Erinnerung: Nicht vergessen, es ist sehr klug wenn man serverseitig mittels FileSystemObject prüft, ob es diese Excelvorlage auch wirklich gibt.
Das wäre eine einfache Variante um kleinere Tabellen für den User auszulesen und in seiner MS-Office Umgebung gleich weiterzuverarbeiten. Mit größeren Listen werden Sie gehörig auf die Downloadgeschwindigkeit der User drücken. Da sollte man dann vorher zumindest einen Hinweis zeigen, daß es etwas dauern könnte.
Wer nun auf die Idee kommt das gezeigte auch mit Word-, Outlook-, Powerpoint-Dateien zu probieren wird schnell merken, daß jedes Office Programm diesbezüglich seine eigenen Wege geht. Zu Word sind im vorangegangenen Artikel Details nachzulesen.
This printed page brought to you by AlphaSierraPapa
Klicken Sie hier, um den Download zu starten.
http://www.aspheute.com/code/20020128.zip
Datenbank zur Weiterbearbeitung in Excel bereitstellen
http:/www.aspheute.com/artikel/20001128.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
Ein Excel-Sheet am Server generieren und zum Client schicken
http:/www.aspheute.com/artikel/20010305.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
Wordfiles richtig öffnen!
http:/www.aspheute.com/artikel/20020122.htm
©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.