Excel für "Arme"

Anleitungen und Quellcode-Auszüge die den Start vereinfachen sollen.

Excel für "Arme"

Beitragvon havanna am Mo 27. Apr 2009, 23:25

Hallo zusammen,
die Tage grübelte ich mal wieder über ein kleines Problem: Mein Auftraggeber wollte das Ergebnis einer Tabellenabfrage gerne als Excel haben. Nun, da schaut man doch mal auf der Cake-Homepage. Allerdings war das was ich fand nicht ganz brauchbar.
Wer von uns hat nicht lokal PHPMyAdmin installiert und kennt die Funktion Export > Excel2000. Ich schaute mir im Quelltext mal an, was die Jungs da gemacht haben.
Da wurde ich doch an etwas erinnert, was ich vor langer Zeit schon einmal mit Bildern gemacht habe: Manipulieren des Headers.
Wenn wir eine leere Seite mit der Endung .htm oder html benennen und diese im Browser aufrufen, interpretiert der Browser diese autom. als HTML Dokument. Genauso ist es auch möglich der Seite die Endung .jpg oder .xls zu geben - und der Browser wird es als Bild bzw. als Excel interpretieren.
Wichtig ist dabei nur, dass der Header entsprechend manipuliert wird.
In Cake sieht das wie nachfolgend beschrieben aus (wie immer kürze ich meinen Quelltext weshalb ich keine Garantie für die Vollständigkeit gebe).
Im Controller habe ich folgende Funktion:
Code: Alles auswählen
  function admin_viewExcel() {
    // ihr könnt hier eure Bedingungen entsprechend füllen - ich lese diese aus der Session
    $conditions = array();
    // Da wir den header manipulieren, ist es zwingend notwendig den Debug-Level auf 0 zu setzen. Andernfalls interpretiert der Browser es als html
    Configure::write('debug', 0);

    $data = array();
    $data = $this->Visit->find('all',array(
            'conditions' => $conditions
            ));
    $this->set('data', $data);
    $this->layout = 'excel'; //dies verwendet das excel.ctp layout
    $this->render();
  }
 


Unser Layout, excel.ctp, sieht wie folgt aus:
Code: Alles auswählen
<?php
(empty($type)) ? $type = 'applications' : $type = $type;
header("Content-type: application/vnd.ms-excel");
header("Content-Disposition: attachment; filename=visits-".$type.".xls");
header("Pragma: no-cache");
header("Expires: 0");
?>
<?php echo $content_for_layout ?>


Der View gibt den Tabelleninhalt wie gewohnt aus:
Code: Alles auswählen
<div id="Classeur1_16681" align=center x:publishsource="Excel">
<table x:str border=0 cellpadding=0 cellspacing=0 width=100% style="border-collapse: collapse">
  <tr>
    <td class=xl2216681 nowrap><b>ID</b></td>
    <td class=xl2216681 nowrap><b>Session</b></td>
    <td class=xl2216681 nowrap><b>IP-Adresse</b></td>
    <td class=xl2216681 nowrap><b>Timestamp</b></td>
    <td class=xl2216681 nowrap><b>URL</b></td>
    <td class=xl2216681 nowrap><b>User</b></td>
  </tr>
  <?php foreach($data as $user): ?>
    <tr>
      <td class=xl2216681 nowrap><?php echo $user['Visit']['id']; ?></td>
      <td class=xl2216681 nowrap><?php echo $user['Visit']['session']; ?></td>
      <td class=xl2216681 nowrap><?php echo $user['Visit']['ipaddress']; ?></td>
      <td class=xl2216681 nowrap><?php echo $user['Visit']['timestamp']; ?></td>
      <td class=xl2216681 nowrap><?php echo $user['Visit']['url']; ?></td>
      <td class=xl2216681 nowrap><?php echo $user['Visit']['user']; ?></td>
    </tr>
  <?php endforeach;?>
</table>
</div>


Wenn wir diese Funktion aufrufen, erhalten wir (getestet in Firefox und IE) ein Popup ob wir die Excel-Datei öffnen oder speichern möchten.
Bild
Ob wir nun öffnen oder speichern wählen, wir erhalten eine einfache Excel-Datei mit unseren Daten.

Drei Anmerkungen dazu:
    Diese Art der Ausgabe erzeugt keine "richtige" Excel-Datei. Das heißt mit dieser Art der Ausgabe kann man keine Tabellenblätter erzeugen o.ä. Aber für viele Anforderungen genügt es sicher.
    Es ist unbedingt darauf zu achten, dass keine Leerzeichen vor der Ausgabe des headers ausgegeben werden - ansonsten interpretiert der Browser es wieder als html, was in der Regel eine leere weiße Seite erzeugt.
    Im <tr>-Tag und im <td>-Tag kann der Befehl x:str oder x:num verwendet werden. Dies hat darauf Einfluss, wie Excel das Feld interpretiert - als String oder als Nummer.
    Kleine Anekdote hierzu am Rande: Vor ein paar Monaten wurde ich von einem Kollegen gebeten einen Massenupdate bestimmter Materialstämme auf unserem ERP-System vorzunehmen. Um die Daten vorab zu selektieren, exportierte ich eine Abfrage nach Excel. Nun haben wir im System dummerweise Materialnummern mit führenden Nullen. Es gibt also 0123 und 123 - was natürlich vollkommen unterschiedliche Materialstämme sind. Ihr könnt euch denken, was mir passiert ist: Excel interpretierte das Feld als Zahl mit der Konsequenz, dass die führenden Nullen fehlten und ich die falschen Materialstämme über einen Massenupdate änderte. Zum Glück hatte ich es gleich danach bemerkt. Um 23 Uhr war ich dann fertig mit den Korrekturen. Dank der Änderungsaufzeichnung konnte ich alle Materialstämme selektieren, die ich geändert hatte. Dies also zur Ausprägung x:str und x:num.
Und nun viel Spaß beim Excel-Download.

Ciao Thomas
Benutzeravatar
havanna
 
Beiträge: 174
Registriert: Mi 15. Okt 2008, 23:12
Wohnort: Bodman-Ludwigshafen
CakePHP-Version: 1.2.x
OS: WIN

Zurück zu Tutorials und Snippets

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

cron