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

Serverdaten clientseitig in Exceltemplates importieren

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.

Das Script

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.

Schlußbemerkung

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

Download des Codes

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

Verwandte Artikel

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.