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

Serverdaten clientseitig in Exceltemplates importieren

Geschrieben von: Herbert Hahn
Kategorie: ASP Tricks

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.

Download des Codes

Klicken Sie hier, um den Download zu starten.

Verwandte Artikel

Datenbank zur Weiterbearbeitung in Excel bereitstellen
Die SA Excel Writer Komponente
Ein Excel-Diagramm am Server generieren und zum Client schicken
Ein Excel-Sheet 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
Wordfiles richtig öffnen!

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.