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

Excel Dateien ohne Excel anzeigen

Geschrieben von: Hubert Daubmeier
Kategorie: ASP Tricks

This printed page brought to you by AlphaSierraPapa

Excel wird gerne zum Verwalten von Listen aller Art verwendet. Es ist einfacher zu handhaben und verlangt weniger - eigentlich keine - Struktur bei der Anlage, wie das etwa eine Datenbank erfordern würde. Nun wäre es doch naheliegend so eine Excel-Datei auch im Web oder Intranet anzubieten. Wie man eine Excel-Datei auf den Server stellt und verlinkt wissen Sie sicher. Aber wie man sie schnell und einfach dem Benutzer anbietet, ohne daß sich Excel öffnet zeigt dieser Artikel.

Ein Folgeartikel beschäftigt sich dann mit dem Gegenteil: wie bietet man dem Besucher eine vorhandene Liste als Excel-Datei an, sodaß sie einfach weiterverwendet werden kann. Dies berücksichtigte der hier vorgestellte Code bereits.

Die Excel-Datei vorbereiten

Zum Vorgehen verwenden wir ADO bzw. den Jet-Datenbanktreiber der auch den Komfort bietet eine Excel-Datei als Datenbank abzufragen. Damit verbunden ist jedoch ein kleiner Wehmutstropfen: da wir die Daten als Datenbank abfragen, können keine Formatierung und keinerlei grafische Objekte (Diagramme, Textfelder, etc) angezeigt werden.

Zwei Dinge sollten erfüllt sein, damit dies funktioniert:

  1. Markieren Sie in Ihrer Excel-Datei den Bereich, der später als Datenbank verwendet werden soll und legen Sie einen beliebigen Namen dafür fest (entweder per Strg-F3 oder EINFÜGEN - NAMEN - NAMEN DEFINIEREN). Wenn Sie das Beispiel ohne Änderung gleich ausprobieren wollen, verwenden Sie bitte den Namen "tabelle". Dies wird hinterher der Name der sich hinter dem SELECT feldliste FROM ...." verbergen wird.
  2. Die Tabelle sollte keine Zellen mit mehr als 255 Zeichen enthalten. Ein schneller Weg um dies zu erreichen wäre das Tabellenblatt in eine neue Mappe zu kopieren. Dabei werden überlange Feldinhalte abgeschnitten. Nebenbei bleibt Ihre eigentliche Arbeitsmappe damit unverändert erhalten. Klicken Sie mit der rechten Taste auf den Karteireiter am unteren Rand der Excelmappe und wählen VERSCHIEBEN/KOPIEREN. Im folgenden Dialog wählen Sie bei "Zur Mappe" den Eintrag "(neue Arbeitsmappe)" aus und kreuzen Sie "Kopie erstellen" an. Die Liste "Einfügen vor" ist hier nicht relevant.

Die Datei noch auf Ihren ASP-fähigen Server gespeichert und schon kann es ans Programmieren gehen. Die Beispieldaten dieses Artikels finden Sie in database.xls, und es handelt sich um Börsedaten:

Der Code zur Wiederverwendung

Nachfolgend die Beschreibung der Datei READDB.ASP, die wir später per serverside include einbinden. In der Konstante CDATABASE wurde der Name der Exceldatei abgelegt und weit oben platziert, damit er sich bei Bedarf schnell ändern lässt. Den Rest der Geschichte kennen Sie sicher aus anderen Beispielen: es werden die Objektvariablen definiert und die Datenbank abgefragt.

Const CDATABASE = "./meineTabelle.xls"

Dim oConn 
Dim oRs 
Dim Index

Set oConn = CreateObject("ADODB.Connection")
oConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Excel 8.0;DATABASE=" & _
Server.MapPath(CDATABASE)
Set oRs = oConn.Execute("SELECT * FROM tabelle")

Im Folgenden wird die Datenbank ausgelesen. Zwei kleinere Probleme tauchen auf: wie heißen denn nun meine Feldnamen in der Datenbank bzw. was passiert, wenn ich deren Namen ändere? Und zum anderen was tun, wenn sich die Anzahl der Spalten ändert? Bestimmt wurden Ihre Spalten und deren Überschriften nicht sehr strukturiert angelegt, wie etwa bei einer Accessdatenbank. Einfache Antwort: plagen Sie sich nicht und überlassen Sie die Arbeit dem System. Das Beispiel zeigt daher, wie Sie die Feldnamen per Indexnummer in einer Schleife ausgeben und damit beide Probleme elegant umgehen können.

  Response.write("<table cellspacing=""0"" cellpadding=""2"">") & vbcrlf
For Index=0 to (oRs.fields.count-1)
  Response.write("<th>" & oRs(Index).Name & "</td>") & vbcrlf
Next

Die erste Zeile schreibt den Tabellenheader. Die folgende Schleife durchläuft die Felder und gibt für jedes Feld per .Name den Feldnamen aus. Ich habe hierbei bewußt die gemischte Schreibweise von ASP Code und HTML vermieden, da die Dinge so doch übersichtlicher bleiben.

Do while (Not oRs.eof)
 Response.write("<tr>") & vbcrlf
For Index=0 to (oRs.fields.count-1)
   Response.write("<td>" & oRs(Index) & "</td>") & vbcrlf
Next
   Response.write("</tr>") & vbcrlf
   oRs.MoveNext 
Loop 

Dieser Codeteil durchläuft nun alle Datensätze und gibt sie der Reihe nach aus. Soweit keine Abweichung von der Standardbehandlung etwa mit einer Access-DB. Zu guter Letzt wird noch der Tabellenabschluß geschrieben und die Datenbank geschlossen.

Response.write("</table>") & vbcrlf

oRs.close
oConn.close 

Der Code im Überblick

Das folgende Gesamtlisting der Include-Datei erweitert das obige Beispiel um:

  1. Eine farbliche Markierung der jeweils zweiten Zeile, um die Daten übersichtlicher darzustellen. Dazu finden Sie im Download ein Beispiel-Stylesheet. Um das Ihren Wünschen anzupassen können Sie übrigens jederzeit Excel "über die Schulter schauen". Speichern Sie einfach eine schön formatierte Tabelle als HTML ab und schauen Sie sich die am Anfang der HTML-Datei abgelegten CSS-Style Angaben an. Als goldene Regel: nur das Wichtige rausholen hält die Dinge übersichtlicher. Selbstverständlich lässt sich anstelle von Stylesheets auch mit direkter Formatierung arbeiten.
  2. Zum anderen wird der Code in einem Unterprogramm zusammengefasst.
  3. 3. Die ASP typischen <%%> Begrenzer dürfen auch nicht fehlen.

<%
Const CDATABASE = "./database.xls"

Dim oConn 
Dim oRs 
Dim Index 
Dim sColorcount, sColorstyle

Sub Readdb()
  Set oConn = Server.CreateObject("ADODB.Connection")
  oConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Excel 8.0;DATABASE=" & _
  Server.MapPath(CDATABASE)
  Set oRs = oConn.Execute("SELECT * FROM tabelle")
    
  Response.write("<table cellspacing=""0"" cellpadding=""2"">") & vbcrlf
  For Index=0 to (oRs.fields.count-1)
    Response.write("<th>" & oRs(Index).Name & "</td>") & vbcrlf
   Next
    sColorcount = 1
   Do while (Not oRs.eof)
    Response.write("<tr>") & vbcrlf
    if (sColorcount and 1) = 1 Then sColorstyle = " class=""marked""" 
	Else sColorstyle = ""
    For Index=0 to (oRs.fields.count-1)
    Response.write("<td" & sColorstyle & ">" & oRs(Index) & _ 
	    "</td>") & vbcrlf
   Next
   Response.write("</tr>") & vbcrlf
   oRs.MoveNext 
   sColorcount = sColorcount + 1
  Loop 
 Response.write("</table>") & vbcrlf

 oRs.close
 oConn.close 
End Sub
%>

Die Endmontage

Bleibt noch die Ausgabe. Da die Include-Datei die komplette Tabelle erstellt, kann die Ausgabeseite einfach oder komplex gehalten sein. Konzentrieren Sie sich in diesem Schritt daher mehr auf das Design und nehmen Sie nur die beiden wichtigen Schritte aus diesem Beispiel heraus: das Einbinden der Include-Datei in Zeile 2 und an passender Stelle der Aufruf der Unterroutine READDB.

Den folgenden Sourcecode finden Sie in der Datei default.asp:

<%@ LANGUAGE = VBScript %>
<!-- #include file="include/readdb.asp" -->

<html>

<head>
<title>Excel als Datenbank </title>
<link rel="stylesheet" type="text/css" href="Include/stylesheet.css">
</head>

<body>

<b>Exceldatei als Datenbank ausgegeben<br>
<hr size="1" color="#000000">

<% call Readdb %>
</body>

</html>

Schlußbemerkung

Das Beispiel ist bewußt einfach gehalten. Ich wollte Ihnen damit primär mehr einen Startpunkt und ein sofort einsetzbares Beispiel geben, das Sie nach Ihren eigenen Ideen ausbauen können. Denkbare Erweitungen reichen von der Formatierung bis zur Fehlerbehandlung und natürlich einem etwas attraktiverem Design. Nicht sehr elegant gelöst ist auch die fest "verdrahtete" Dateiangabe. Da Sie das Beispiel sicher für Ihre Bedürfnisse - etwa um die Übergabe eines Abfragekriteriums - anpassen werden, sollte Ihrer Kreativität keine Grenze gesetzt sein.

This printed page brought to you by AlphaSierraPapa

Download des Codes

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

Verwandte Artikel

Datenbank zur Weiterbearbeitung in Excel bereitstellen
http:/www.aspheute.com/artikel/20001128.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 Diagramme als GIF's serven
http:/www.aspheute.com/artikel/20010309.htm
Serverdaten clientseitig in Exceltemplates importieren
http:/www.aspheute.com/artikel/20020128.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.