Aktuelles

Excel, Linux & Perl

Es kam wie es kommen musste. Aus dem angeforderten Windows Reporting Server mit Oracle und Office Installation wurde (wie immer aus Kostengründen) ein kleiner Linux Server mit MySQL. Hm…. Sicher, Datenbankanbindung und Mail sind auch in diesem Umfeld kein Problem. Aber wie werden Excel Berichte unter Linux generiert? Gehört hat man ja schon von Office Lösungen für Linux. Aber wie sieht es in der Praxis aus?

Mit der Veröffentlichung der Dateiformate für Office 2007 können mittlerweile moderne Office Dokumente auch von nicht Office Produkten gelesen und erzeugt werden. Bis dahin wurde das Dateiformat durch Mittel des Reverse Engineering analysiert und darauf die Toolentwicklung aufgesetzt. Ein mühseliger und fehleranfälliger Prozess.

Dank einer rührigen Community gibt es seither viele freie Lösungen zur Erzeugung von Excel Sheets unter Linux. Die Bandbreite reicht dabei von Libre-/OpenOffice als Alternativen zur MS Office Suite über APIs für diverse Sprachen mit denen Excel Sheets gelesen bzw. erzeugt werden können. Aufgrund des nicht dokumentierten Dateiformats für ältere Office Produkte beschränkt sich die Unterstützung meistens auf neuere Office Versionen. XLS wird also nicht von allen unterstützt (eine der Ausnahmen ist Apache POI mit Unterstützung der alten Formate); das ist in diesem Kontext aber auch nicht notwendig.

Einfach und schnell soll es sein; deshalb wurde die Entscheidung für Perl getroffen. Das Modul Excel-Writer-XLSX macht mit seiner Dokumentation auf den ersten Blick einen guten Eindruck. Einzige Einschränkung scheint die (noch) fehlende Unterstützung für Pivot Tabellen zu sein. Also los mit der Installation.

Am einfachsten ist die Installation mittels cpan 

> cpan install Excel::Writer::XLSX

Wenn z.B. Firewall Einstellungen das verhindern reicht in diesem Fall die Installation des dort verfügbaren tar Pakets (keine weiteren Abhängigkeiten).

> tar –xzvf Excel-Writer-XLSX-0.85.tar.gz
> perl Makefile.pl
> make 
> make test
> make install

Damit ist Excel-Writer-XLSX als Teil der Perl Installation verfügbar. Und jetzt? Mit nur 5 Zeilen Perl Code erstellt man ein einfaches Excel Sheet:

use Excel::Writer::XLSX;
$workbook = Excel::Writer::XLSX->new ("perl.xlsx");
$worksheet = $workbook->add_worksheet ();
$worksheet->write ("A1", "Zelle A1");
$workbook->close;

Sprich: Zuerst das Workbook erzeugen, anschließend ein Sheet an das Workbook hängen und im Sheet die Zellen mit Daten füllen.

Einziger Wehrmutstropfen: Um das Ergebnis in Excel ansehen zu können, muss die Datei auf den Windows Rechner übertragen werden um sie dort mit Excel zu öffnen. Fernsteuerung mit Win32::OLE war da schon komfortabler (und hat auch mehr Spaß gemacht). 

Eine Zelle kann auf mehreren Wegen adressiert werden:

$i = 1;
$worksheet->write ("A$i", "A$i");
$worksheet->write (0, 1, "0, 1");
$worksheet->write ($i, 0, "$i, 0");
$worksheet->write ("b2", "b2");

Diese Optionen ermöglicht einfaches Navigieren innerhalb des Sheets in Schleifen oder durch Berechnung der Index Werte. Im Prinzip gibt es verschiedene Methoden für die diversen Datentypen um Werte in eine Zelle zu schreiben (write_string, write_number, write_formula, ...). write identifiziert den Typ durch entsprechende reguläre Ausdrücke und ruft die passende Methode auf. Zur Formatierung von Zellen (bzw. Zeilen und Spalten) werden Formatobjekte genutzt. Hier wird es etwas umständlich. Ein Format Objekt umfasst immer alle gewünschten Eigenschaften; einzelne Eigenschaften einer Zelle (z.B. Rot/Grün Färbung) können nicht geändert werden:

$red   = $workbook->add_format (align => 'center', bold => 1, 
                                color => 'white', bg_color => 'red');
$green = $workbook->add_format (align => 'center', bold => 1, 
                                color => 'black', bg_color => 'green');
$worksheet->write ("A1", "grün", $green);
$worksheet->write ("B1", "rot", $red);

Und da ein Bild mehr als 1000 Worte sagt noch ein kleines Beispiel für den Umgang mit Grafiken:

use Excel::Writer::XLSX;

$workbook = Excel::Writer::XLSX->new ("perl.xlsx");
$worksheet = $workbook->add_worksheet ();
$format = $workbook->add_format (border => 1);
$worksheet->write ("A1", "Fibonacci", $format);
$worksheet->write ("a2", 1, $format);
$worksheet->write ("a3", 1, $format);

# Fibonacci for ($i = 4; $i <= 15; $i++) {
$worksheet->write ("A$i", "=a" . ($i-2) . "+a" . ($i-1), $format);
}
# Create chart and fill values $chart = $workbook->add_chart (type => 'column', embedded => 1); $chart->add_series (name => '=Sheet1!$a$1',
values => '=Sheet1!$A$2:$A$15');
# Insert chart at position C1 $worksheet->insert_chart ( "C1", $chart ); $workbook->close;

Insgesamt deckt dieses Perl Modul mit mehr oder weniger geringem Aufwand alle Anforderungen des konkreten Projekts ab. Was u.a. nicht geht ist die Modifikation von bestehenden XLSX Dateien und die Funktionalität von Autofit (automatische Größenanpassung) die eine Eigenschaft des Excel Clients ist. Damit können aber sämtliche Projektbeteiligten leben.

Neugierig geworden? In der CPAN Dokumentation finden sich eine Reihe von Beispielen, die Antworten auf die meisten gängigen Problemstellungen bieten.