Excel-Dateien erstellen statt CSV

Immer wieder stoßen wir Programmierer auf den Wunsch, Daten exportierbar bereitzustellen, damit sie vom Kunden am eigenen Rechner weiterverarbeitet werden können. Wirklich saubere Strukturen via SQL-Dump oder XML stoßen hierbei in der Regel auf große Augen und viiiiele Fragezeichen. Also wird auf einfache Strukturen runtergebrochen, die überall funktionieren: CSV. „Geht das nicht einfach als Excel-Datei?“ Durch das seltsame Eigenleben von Excel und eigentümliche Interpretation von CSV-Daten sind solche Dateien der Schmerz wohl jeden Programmierers (außerhalb Redmonds). Aber es gibt eine einfache Lösung.

Warum kein CSV?

CSV ist eine lang erprobte Konvention, wie relativ problemlos tabellarische Daten ausgetauscht werden können. Die wesentlichen Punkte dabei:

  1. Es gibt ein festgelegtes Zeichen als Zeilentrenner (meist Zeilenumbruch)
  2. Es gibt ein festgelegtes Zeichen als Spaltentrenner (meist Komma oder Strichpunkt)
  3. Es gibt ein festgelegtes Zeichen, welches Spalteninhalte kapselt und dadurch das Vorkommen der Zeichen aus 1+2 in Spalten ermöglicht

Das funktioniert wunderbar – nur in keinem Excel! Was die restliche Welt (incl. Vorschau am Mac) richtig versteht und gleich in eine Tabelle wandelt, versteht Excel auf Anhieb nicht. Öffnet man die CSV-Datei nicht via Doppelklick, sondern umständlicher übers Menü, so lassen sich die Trennzeichen usw. setzen, und man bekommt mit etwas Glück zumindest Teile korrekt angezeigt. Für einen Kunden ist das aber eher eine Zumutung. 🙁

Einfache Excel-Dateien (XLS) erzeugen

Letztens bin ich auf eine sehr smarte Lösung gestoßen: php-excel. Die Klasse ist keine Excel-Implementierung in php samt Formeln usw., kann aber die einfache Aufgabe, eine Datentabelle als XLS auszugeben, einfach und zügig bewerkstelligen. Einfach die Klasse einbinden, Objekt erzeugen, Daten hinzufügen, XLS generieren (wird mit passendem Header via echo ausgegeben):

$colNames = array('uid', 'title');
$lines = array();
$lines[] = $colNames;
$lines[] = array(1, 'Erster Datensatz');
$lines[] = array(2, '2. Datensatz');
$lines[] = array(5, '3. Datensatz');
$lines[] = array(12, 'Vierter Datensatz');
 
$xls = new Excel_XML('UTF-8', false, $name); 
$xls->addArray($lines); 
$xls->generateXML($name . '_' . date('Ymd-Hi'));  
  // Exits: 
exit;

Links

Schreibe einen Kommentar