In 10 Minuten Excel-Reports mit Perl erstellen

Digicomp-Trainer Renato Testa erklärt, wie Sie mit Perl ganz einfach Systeminformationen in Excel darstellen, Formeln anwenden und formatieren.

Autor Renato Testa
Datum 27.05.2019
Lesezeit 5 Minuten

Jeder Administrator kennt die Situation, dass Informationen eines oder mehrerer Systeme schnell gesammelt und in einer Tabelle dargestellt werden müssen. Welcher Container (LXC oder Docker) braucht wieviel RAM, CPU, Network Load und vieles mehr… Dank der Transparenz von unixoiden Systemen, ist es kein Problem diese Informationen zu finden.

Aber oft ist dann eine Excel-Tabelle gefragt. Solche Ad-Hoc-Übungen sind dank mächtigen Unix-Werkzeugen mit einem Aufwand von 10 bis 30 Minuten machbar.

Dank dem Perl-Modul «Excel::Writer::XLSX» ist dies kein Problem. Die Installation erfolgt wie immer mittels:

sudo perl -MCPAN -e 'install Excel::Writer::XLSX'

Ein einfaches Beispiel

Das folgende Beispiel zeigt, wie einfach es ist:

#!/usr/bin/perl

use strict;
use warnings;
use Excel::Writer::XLSX;
my $workbook  = Excel::Writer::XLSX->new( 'test1.xlsx' );
my $worksheet = $workbook->add_worksheet();
$worksheet->write( "A1", "Hallo Excel!" );
$worksheet->write( "A2", "eine 2. Zeile" );
$workbook->close;

Mittels der Methode «new» konstruieren wir ein neues Objekt. Wenig überraschend wird mittels «add_worksheet» ein neues Worksheet kreiert. Anschliessend wird mittels «write» neuer Content zu unserem Worksheet hinzugefügt. Dann wird das Workbook mit «close» geschlossen.

Et voilà:

Formeln

Ein häufig benutztes Feature von Excel sind Formeln. Zum Beispiel:

#!/usr/bin/perl

use strict;
use warnings;
use Excel::Writer::XLSX;
my $workbook  = Excel::Writer::XLSX->new( 'test2.xlsx' );
my $worksheet = $workbook->add_worksheet();
$worksheet->write( "A1", 27 );
$worksheet->write( "A2", 34 );
$worksheet->write( "A3", "=A1+A2" );
$worksheet->write( "A4", "=SUM(A1:A3)" );
$workbook->close;

Und das Resultat:

Formatierung

Personen, speziell aus dem Management, haben es gerne formatiert bzw. bunt in solchen Reports. Auch dies stellt für das Modul keine Hürde dar:

#!/usr/bin/perl
use strict;
use warnings;
use Excel::Writer::XLSX;
my $a = 27;
my $b = 34;
my $workbook  = Excel::Writer::XLSX->new( 'test3.xlsx' );
my $worksheet = $workbook->add_worksheet();
my $error_format = $workbook->add_format(
color     => 'red',
);
$worksheet->write( "A1", $a );
if ( $b >= 30 ) {
$worksheet->write( "A2", $b, $error_format );
} else {
$worksheet->write( "A2", $b );
}

$workbook->close;

Via die Methode «add_format» definieren wir beliebige Formatierungen.

Das Resultat:

Ein praktisches Beispiel

Das Kommando «docker stats –no-stream» liefert uns Zeilen (1/Container) in der Form:

NAME                CPU %               MEM USAGE / LIMIT   MEM %               NET I/O
aldebaran           1.84%                 1.111 GB/5.064 GB 2.19%             3.51 GB/13.83 MB
...

Je nach docker-Version kann der Output variieren. Praktisch wäre nun eine Excel-Tabelle mit diesen Werten, um z.B. den gesamten Verbrauch an Memory zu berechnen.

Container, welche die max. Limite an Memory übersteigen, hätten wir gerne rot markiert – und am Schluss das Total der CPU- und Memory-Usage.

#!/usr/bin/perl
use strict;
use warnings;
use Excel::Writer::XLSX;
my @title = ( "NAME", "CPU %", "MEM USAGE", "LIMIT", "MEM %", "NET RX", "Net TX" );
my $col = 0;
my $row = 1;
my $workbook  = Excel::Writer::XLSX->new( 'test4.xlsx' );
my $worksheet = $workbook->add_worksheet();
my $error_format = $workbook->add_format(
color     => 'red',
);

# write the title. NOTE: we use coordinates e.g. 0,0 is A1, A2 is 1,0, B1 is 0,1
for ( my $i=0; $i <= $#title; $i++ ) {
$worksheet->write( 0, $i, "$title$i" );
}

# we read stdinput which comes from "docker stats --no-stream" via pipe
while ( <> ) {
s/kMG?B\/?/ /g; # replace unwanted stuff by ' '

my @line = split ( /\s+/ );
for ( my $i=0; $i <= $#line; $i++ ) {
$line$i =~ s/%//;
if ( $i == 2 and $line$i >= $line$i+1 ) { # print in red if MEM USAGE is > MEM MAX
$worksheet->write( $row, $i, "$line$i", $error_format );
} else {
$worksheet->write( $row, $i, "$line$i" );
}
}
$row++;
}
$worksheet->write( $row, 0, "Total" );
$worksheet->write( $row, 1, "=SUM(B2:B" . $row . ")" );
$worksheet->write( $row, 2, "=SUM(C2:C" . $row . ")" );
$workbook->close;

Und das Ergebnis:

Zusammenfassung

  • Perl zu kodieren macht wohl mehr Spass als Excel anzuwenden und copy&paste-Orgien zu durchlaufen.
  • Aber, wie immer, wir befriedigen auch solche (exotischen?) Wünsche.
  • Der Aufwand solcher ad-hoc-Lösungen ist minimal.
  • Das Management ist glücklich.

Programmieren mit Perl («UWP»)

Lernen Sie im Kurs einfache Perl-Scripte zu schreiben, Perl-Module anzuwenden, bestehende Perl-Programme zu modifizieren und einfache Web-Applikationen zu programmieren.

Aktuelle Kursangebote

Lernen Sie im Kurs einfache Perl-Scripte zu schreiben, Perl-Module anzuwenden, bestehende Perl-Programme zu modifizieren und einfache Web-Applikationen zu programmieren.

Aktuelle Kursangebote


Über den Autor

Renato Testa

Renato Testa ist seit 25 Jahren in der IT und im Unix-Umfeld tätig. Mitte der 90er-Jahre führte er die ersten Linux-Kurse  bei Digicomp durch. Neben der Systemprogrammierung ist vor allem Systemadministration von Unix/Linux-Systemen sein Hauptgebiet. Im Rahmen verschiedener OSS-Events bei Digicomp hielt er Referate zu Themen wie HA-Firewalls, OpenSolaris oder Linux-Cluster. Seit 2014 ist sein Hauptthema DevOps in verschiedenen Cloud-Projekten. Renato Testa ist seit 1994 Trainer bei Digicomp und ist im Besitze der SVEB I Zertifizierung.