Excel Dateien mit PHPExcel erstellen

Letzte Woche habe ich hier bereits darüber geschrieben, wie man mit dem MS-Excel Stream Handler Excel Dateien erstellen kann, nun habe ich hier noch eine andere, viel umfangreichere Lösung.
Die Lösung nennt sich PHPExcel und kommt von CodePlex. Die "Installation" ist sehr simpel, ZIP Datei herunterladen und die PHP-Dateien auf dem Server speichern. Im Script, das die Excel Datei schreiben soll dann die Dateien PHPExcel.php und PHPExcel/IOFactory.php einbinden.
<?
require_once("includes/PHPExcel.php");
require_once(
"includes/PHPExcel/IOFactory.php");
?>

Die ganze Klasse ist viel zum Umfangreich um hier komplet beschrieben zu werden, ich beschränke mich lediglich auf das schreiben eines Excel Files ohne Formatierung. Wer etwas Farbe ins speil bringen will, oder Formeln, Rahmen usw. benutzen will führt sich am besten die sehr ausführliche Dokumentation zu gemüte.

Wenn die beiden Dateien eingebunden sind, muss man als erstes eine Instanz der Klasse erstellen und kann danach gewisse Dokumenteigenschaften wie den Ersteller Titel usw. schreiben.
<?
// neue instanz erstellen
$xls=new PHPExcel();

// dokumenteigenschaften schreiben
$xls->getProperties()->setCreator("David Lienhard")
                     ->
setLastModifiedBy("David Lienhard")
                     ->
setTitle("Test")
                     ->
setSubject("Test");
?>


Beim nächsten Schritt definiert man, in welches Worksheet man schreiben will. Ich habe bei diesem Beispiel nur ein Sheet und so kann ich auch nur das anwählen.
<?
// das erste worksheet anwaehlen
$sheet=$xls->setActiveSheetIndex(0);
?>


Nun kann man die gewünschten Daten in die Datei schreiben. Die Methode erwartet zwei Parameter. Zum einen das Feld, in das geschrieben werden soll und der Wert, der geschrieben werden soll. Das Feld muss im Format A1 angegeben werden, also genau wie im Excel.
<?
// den wert test in das Feld A1 schreiben
$sheet->setCellValue("A1","test");
?>


Nun kann man noch den Titel des aktuellen Worksheets definieren. Wird nichs angegebn wird einfach der Filename benutzt.
<?
// den namen vom Worksheet 1 definieren
$xls->getActiveSheet()->setTitle("Titel");
?>


Zum Schluss müssen die Daten noch in eine Datei geschrieben werden. Dazu erstellt man erstmal eine neue Instanz der IOFactory und gibt dort an, welchen Dateityp die Datei haben soll. Also Excel 2007, Excel 5 usw. Ich habe aus Kompatibilitätsgründen Excel 5 gewählt.
<?
// eine writer instanz erstellen
// das dateiformat ist hier excel5
// alt, aber von allen excel versionen lesbar
$writer=PHPExcel_IOFactory::createWriter($xls,"Excel5");

// die daten speichern
$writer->save("filename.xls");
?>


Und so sieht das ganze Script aus:
<?
// neue instanz erstellen
$xls=new PHPExcel();

// dokumenteigenschaften schreiben
$xls->getProperties()->setCreator("David Lienhard")
                     ->
setLastModifiedBy("David Lienhard")
                     ->
setTitle("Test")
                     ->
setSubject("Test");

// das erste worksheet anwaehlen
$sheet=$xls->setActiveSheetIndex(0);

// den wert test in das Feld A1 schreiben
$sheet->setCellValue("A1","test");

// den namen vom Worksheet 1 definieren
$xls->getActiveSheet()->setTitle("Titel");

// eine writer instanz erstellen
// das dateiformat ist hier excel5
// alt, aber von allen excel versionen lesbar
$writer=PHPExcel_IOFactory::createWriter($xls,"Excel5");

// die daten speichern
$writer->save("filename.xls");
?>

Excel Dateien mit PHP und MS-Excel Stream Handler erstellen

Im Geschäft musste ich eine kleine Web-App erstellen, die Excel-Files ausliest und in einem anderen Format wieder neue Excel-Files schreibt. Wie man Excel-Files ausliest habe ja ja bereits beschrieben, darum hier eine kleines Howto, wie man Excel-Dateien schreibt.

Von PHP selber gibt es dazu keine Funktionen, dafür aber verschiedene Klassen und Funktionen dritter. Eine recht simple Möglichkeit ist der MS-Excel Stream Handler, den man nach einer Registration gratis herunterladen kann.

Die Funktion wird über ein File eingebunden und registriert sich dann gleich selber einen neuen Filestream mit dem Namen xlsfile. Die Vorgehensweise ist recht simpel: Man erstellt sich einen zweidimensionalen Array und schreibt diesen serialisiert über den Stream in die Datei. Etwas unschön ist in meiner Meinung, dass der Array-Index gleich als erste Zeile benutzt wird.

Aber hier ein kleines Beispiel:
<?
// einen array erstellen
$data=array();

// zweite zeile definieren
// der array-index (ueberschrift1-5) wird als erste zeile verwendet
$data[]=array(
    
"ueberschrift1" =>  "zeile 2 - spalte 1",
    
"ueberschrift2" =>  "zeile 2 - spalte 2",
    
"ueberschrift3" =>  "zeile 2 - spalte 3",
    
"ueberschrift4" =>  "zeile 2 - spalte 4",
    
"ueberschrift5" =>  "zeile 2 - spalte 5");

// dritte zeile definieren
$data[]=array(
    
"ueberschrift1" =>  "zeile 3 - spalte 1",
    
"ueberschrift2" =>  "zeile 3 - spalte 2",
    
"ueberschrift3" =>  "zeile 3 - spalte 3",
    
"ueberschrift4" =>  "zeile 3 - spalte 4",
    
"ueberschrift5" =>  "zeile 3 - spalte 5");

// dateiname definieren
$filename="excel.xls";

// stream oeffnen
$fp=fOpen("xlsfile:/".$filename,"wb");

// check ob datei erstellt werden konnte (schreibrechte, korrekter pfad)
if(!is_resource($fp))
{
    die(
"konnte datei nicht erstellen");
}

// den serialisierten array schreiben
fWrite($fp,serialize($data));

// datei schliessen
fClose($fp);
?>

Das ergibt dann das folgende Erbebnis:
http://images.t-error.ch/blog/1256/excel.jpg


Der erstellen eines Excel-Files geht so sehr einfach und schnell von der Hand, dafür hat man aber keine weiteren Konfigurationsmöglichkeiten. Man kann keine weiteren Tabellenblätter hinzufügen und die erste Zeile ist immer der Arrayindex.
Ich werde auf meiner Blog demnächst eine andere Möglichkeit beschrieben, die etwas aufwändiger ist, aber auch mehr Konfigurationsmöglichkeiten bietet.

Formularfelder im Excel 2007 einfügen

Ich bin im Geschäft geraden das neue 2007 Office von MS am testen. Das ganze sieht nun ganz anders aus als bei den älteren Versionen und dementsprechend sucht man gewisse Funktionen auch mal ein weilchen.
Bei mir heute so geschehen, als ich auf der Suche nach Formularfeldern war. Wenn man weiss, wie es geht, ist es aber nicht mal so schwierig. Als erstes muss man dazu in die Optionen vom Excel und dort die Option "Entwicklerregisterkarte in der Multifunktionsleiste anzeigen" aktivieren.


Nun hat man neu das Ribbon "Entwicklertools" und kann dort mit einem Klick auf "Einfügen" ganz einfach Formularfelder einfügen.
http://images.t-error.ch/blog/603/einfuegen.jpg


So einfach ist es, wenn man es mal weiss.

Excel Dateien mit dem PHP-ExcelReader lesen

Für ein Projekt im Geschäft muss ich Daten von einer Excel Datei in eine mySQL Datenbank importieren. Das man im Excel nicht einfach sagen kann "Export zu mySQL" ist ja wohl klar. Also muss man das mit einem Script machen, ich benutze dazu PHP.
Das Problem ist ja bekanntlich nur das Auslesen der Daten aus der Excel Datei, das Schreiben in die DB geht mir PHP ja recht einfach von der Hand.

Eine Möglichkeit ist das Speichern der Excel Datei als XML und dann die XML Datei mit PHP zu lesen. Allerdings speichert Excel beim XML Export noch jede Menge zusätzlicher Informationen mit, die man nicht wirklich braucht, die Datei ist dann etwa doppelt so gross wie vorher und das lesen mit PHP Dauert auch ein weilchen.

Eine Alternative ist der PHP-ExcelReader. Damit kann man sehr einfach auf die Daten in Excel Dateien zugreifen. Das alles ohne einen mühsamen XML-Export und andere Verrenkungen. Hier möchte ich ein an einem kleinen Beispiel zeigen, wie man mit dem PHP-ExcelReader eine Excel Datei ausliest.

Als erstes muss man natürlich die ZIP Datei herunterladen und auf den Webserver kopieren. Dann kanns auch schon losgehen. Diese Datei muss nun natürlich auch eingebunden werden.
<?
// Excel Reader einbinden
require_once("excel/reader.php");
?>

Das das ganze eine Klasse ist kann man nun ein neues Objekt erstellen und auch gleich die Datei öffnen.:
<?
// Objekt erstellen, Encoding definieren
$xls=new Spreadsheet_Excel_Reader();
$xls->setOutputEncoding("CP12522");

// Die Datei daten.xls oeffnen
$xls->read("daten.xls");
?>


Da die Excel Dateien mehrere Tabellen (Worksheets) haben, muss man zuerst angeben, von welcher Tabelle man die Daten auslesen will. In diesem Beispiel wird mit einer Schleife jede Tabelle durchgegangen.
<?
// durch die Worksheets gehen
$counter=0;
foreach(
$xls->boundsheets AS $worksheet )
{
    
$sheet=$xls->sheets[$counter];
   
    
// worksheet ist der Zeiger in die Info der Tabelle
    // sheet ist der Zeiger in die Daten der Tabelle

    
$counter++;
}
?>

Mit den beiden Zeigern $worksheet und $sheet ist es nun ein leichtes die gewünschten Daten aus der Datei zu lesen. Nun aber noch ein komplettes Script, welches die Zeilen und Spalten der jeweiligen Tabelle und die Spaltenüberschriften ausgibt.
<?
ini_set
('memory_limit''10M');

// Excel Reader einbinden
require_once("excel/reader.php");

// Objekt erstellen, Encoding definieren
$xls=new Spreadsheet_Excel_Reader();
$xls->setOutputEncoding("CP12522");

// Die Datei daten.xls oeffnen
$xls->read("daten.xls");

// durch die Worksheets gehen
$counter=0;
foreach(
$xls->boundsheets AS $worksheet )
{
    
$sheet=$xls->sheets[$counter];

    
// worksheet ist der Zeiger in die Info der Tabelle
    // sheet ist der Zeiger in die Daten der Tabelle
    
$cols=$sheet['numCols'];
    
$rows=$sheet['numRows'];
    echo 
"<b>Arbeitsblatt ".($counter+1).": ".$worksheet['name']."</b><br />";
    echo 
"hat: ".$rows." Zeilen und ".$cols." Spalten.";

    
// Schleife ueber die Daten der Zeile 1 (bzw. 0
    
$celldata=$sheet['cells'];
    
$headrow=1;
    echo 
"<br /><br /><b>Spaltenueberschriften:</b><br />";
    for(
$x=1;$x<=$cols;$x++)
    {
        echo 
$celldata[$headrow][$x]." : ";
    }

    
$counter++;

    echo 
"<br /><br />";
}
?>


Beachten sollte man aber, dass so ein Script, je nach grösser der Excel Datei, einen grossen Speicher Verbrauch hat. Es macht also Sinn mit ini_set() das Memory-Limit etwas nach oben zu setzten, wenn man die Möglichkeit dazu hat.

Excel: Eurovalue dauerhaft entfernen

Wer kennt die nervige Eurovalue-Erweiterung im Excel nicht. In der Symbolleiste kann man sie zwar entfernen, aber beim erneuten öffnen von Excel ist sie wieder da.
http://images.t-error.ch/blog/127/eurovalue_01.jpg

Wie bringt man die nun dauerhaft weg? Da das ganze als Add-In eingebunden ist, muss man über Extras->Add-Ins das Add In Fenster öffnen.
http://images.t-error.ch/blog/127/eurovalue_02.jpg

Und dort den Hacken bei Eurowährungs-Tool entfernen. Und auf nimmerwiedersehen, Eurovalue.
http://images.t-error.ch/blog/127/eurovalue_03.jpg