|
|
|
Perl Open Report Framework
Index
|
|
|
|
|
Hallo,
ich entwickle ein neues Report Framework, das aus (einer Liste von) Arrays, Hashes oder Objects einen Report generiert, als Text, CSV, HTML, XML, ....
Download
Die aktuelle Version 2.x findet sich auf dem CPAN: Report::Porf
Docs
Die folgenden Docs beziehen sich auf Verson 1.x. Inzwischen wurden alle Methoden/Subs von CamelCase auf "_"-Schreibweise umgestellt.
Features
Als Einzeiler zum Debuggen mit auto_report()
use Report::Porf qw(:all);
auto_report(\@list_of_hashes); # prints out first 10 data rows
auto_report(\@list_of_hashes, $file); # writes out all data rows into file
Konfiguration
Pro Spalte (Column), Zelle (Cell):
- max_width
- min_width
- align: left | center | right
- Colors (selection by data possible)
- Fonts
In Planung
- Multi-Column-Cells
- Multi-Row-Cells
- Werteausgabe in mehreren Zeilen
- Visitenkarten-Format
- berechneten Werten / Rows / ...
Warum noch ein neuer Perl-Report?
Es gibt natürlich diverse Perl-Report-Generatoren, aber ich habe nicht das passende gefunden. Ich kenne aber auch noch nicht alle...
Mindestens eine Eigenschaft fehlt den bereits vorhandenen Report-Generatoren/Frameworks:
- "Perlisch"
- Einfach zu konfigurieren
- Unterstützung der wichtigsten Ausgabeformate
- Performance
- Unabhängigkeit von anderen Modulen
- Vorkonfiguriert
- Volle Konfigurierbarkeit
- Erweiterbarkeit
- Leichter Einbau von neuen Formaten
- Unterstützung von Varianten für dasselbe Format
Deshalb habe ich mit der Entwicklung des neuen Perl-Open-Report-Frameworks begonnen. HTML, Text und CSV werden bereits unterstützt.
Wer möchte, kann mit mir in meinem Blog auf blogspot über Porf diskutieren.
Beispiel
Wenn man die Automatik nicht verwenden und die Kontrolle übernehmen
möchte, kann man sich die Spalten (hier drei) auch selbst
konfigurieren:
#### --- Alternative 1 --- ARRAY --- configure columns like this ---------------------
my $prename = 1;
my $surname = 2;
my $age = 3;
$report->configure_column(-header => 'Prename', -value_indexed => $prename ); # long
$report->conf_col (-h => 'Surname', -val_idx => $surname ); # short
$report->cc (-h => 'Age', -vi => $age ); # minimal
oder
#### --- Alternative 2 --- HASH --- configure columns like this ----------------------
$report->configure_column(-header => 'Prename', -value_named => 'Prename' ); # long
$report->conf_col (-h => 'Surname', -val_nam => 'Surname' ); # short
$report->cc (-h => 'Age', -vn => 'Age' ); # minimal
oder
#### --- Alternative 3 --- OBJECT --- configure columns like this ------------------------
$report->configure_column(-header => 'Prename', -value_object => 'GetPrename()'); # long
$report->conf_col (-h => 'Surname', -val_obj => 'GetSurname()'); # short
$report->cc (-h => 'Age', -vo => 'GetAge()' ); # minimal
oder
#### --- Alternative 4 --- Free --- configure columns like this --------------------------
$report->configure_column(-h => 'Prename', -value => '"Dr. " . $_[0]->{Surname}' );
$report->conf_col (-h => 'Surname', -val => sub { return $_[0]->{Prename}; }; );
$report->cc (-h => 'Age (Months)', -v => '(12.0 * $_[0]->GetAge())' );
Das ist die absolut minimale Konfiguration. Auf CPAN gibt es Beispiele für weitere Möglichkeiten.
Ergebnisse
Und so sieht das Ergebnis aus:
Als HTML-Tabelle:
Prename | Surname | Age |
Vorname 1 | Name 1 | 6.66666666666667 |
Vorname 2 | Name 2 | 13.3333333333333 |
Vorname 3 | Name 3 | 20 |
Vorname 4 | Name 4 | 26.6666666666667 |
Vorname 5 | Name 5 | 33.3333333333333 |
Vorname 6 | Name 6 | 40 |
Vorname 7 | Name 7 | 46.6666666666667 |
Vorname 8 | Name 8 | 53.3333333333333 |
Vorname 9 | Name 9 | 60 |
Vorname 10 | Name 10 | 66.6666666666667 |
Vorname 11 | Name 11 | 73.3333333333333 |
Vorname 12 | Name 12 | 80 |
Vorname 13 | Name 13 | 86.6666666666667 |
Vorname 14 | Name 14 | 93.3333333333333 |
Vorname 15 | Name 15 | 100 |
Als Text:
*============+============+============*
| Prename | Surname | Age |
*------------+------------+------------*
| Vorname 1 | Name 1 | 7.69230769 |
| Vorname 2 | Name 2 | 15.3846153 |
| Vorname 3 | Name 3 | 23.0769230 |
| Vorname 4 | Name 4 | 30.7692307 |
| Vorname 5 | Name 5 | 38.4615384 |
| Vorname 6 | Name 6 | 46.1538461 |
| Vorname 7 | Name 7 | 53.8461538 |
| Vorname 8 | Name 8 | 61.5384615 |
| Vorname 9 | Name 9 | 69.2307692 |
| Vorname 10 | Name 10 | 76.9230769 |
| Vorname 11 | Name 11 | 84.6153846 |
| Vorname 12 | Name 12 | 92.3076923 |
| Vorname 13 | Name 13 | 100 |
*============+============+============*