Reportes en XLS desde Bugzilla

Bugzilla permite crear reportes y generar ficheros XML o HTML a partir de búsquedas pero esta funcionalidad puede ser extendida para que no perdamos el tiempo convirtiendo el XML a un fichero legible por algún software de hojas de cálculo. Al principio intente convertir el XML a algo como tablas XHTML pero me di cuenta de lo complicado que puede ser para un usuario.
Finalmente me decidí por utilizar el módulo de Perl Spreadsheet::WriteExcel el cual permite generar ficheros XLS. Claro que pensé en utilizar el módulo OpenOffice::OODoc con el cual habría podido generar ficheros ODS pero habría tenido que instalar el plug-in de Sun en todos los PC's de la empresa. En fin, el fichero XLS generado es bastante estándar por lo cual no habrá problemas.

Lo primero es añadir el botón que nos permitirá acceder al CGI que generará el XLS. Esto lo hacemos modificando el fichero:

/var/lib/bugzilla/template/en/default/list/list.html.tmpl

Añadimos lo siguiente:


[%#Create a button to Export the result to an XLS file#%]
<form method="post" action="export_excel.cgi">
[% FOREACH id = buglist %]
<input type="hidden" name="id" value="[% id FILTER html %]">
[% END %]
<input type="hidden" name="format" value="xls">
<input type="submit" value="Export XLS">
</form>



Bugzilla utiliza estas plantillas para generar sus ficheros HTML que son mostrados. Estas plantillas se encuentran en ese directorio y son procesadas por el Template Toolkit (Template::Toolkit).

Ahora debemos instalar en nuestro servidor el módulo Spreadsheet::WriteExcel. Este se puede descargar aquí. O en un Ubuntu Server podemos obtenerlo instalando el paquete libspreadsheet-writeexcel-perl.

Lo siguiente es crear el fichero export_xls.cgi en el directorio del Bugzilla en:

/usr/lib/cgi-bin/bugzilla/

#!/usr/bin/perl -wT
use lib "/usr/share/bugzilla";

use Bugzilla;
use Bugzilla::Bug;
use Spreadsheet::WriteExcel;

require "globals.pl";

my $cgi = Bugzilla->cgi;

if ($cgi->param('GoAheadAndLogIn')) {
Bugzilla->login(LOGIN_REQUIRED);
} else {
Bugzilla->login();
}

my @bugs = ();
foreach my $id ($cgi->param('id')) {
my $bug = new Bugzilla::Bug($id, Bugzilla->user->id);
push @bugs, $bug;
}

my @bug_list;
if ($cgi->cookie("BUGLIST")) {
@bug_list = split(/:/, $cgi->cookie("BUGLIST"));
}

print $cgi->header;

my $workbook = Spreadsheet::WriteExcel->new("/var/www/bugzilla/bugzilla-report.xls");

my $worksheet = $workbook->add_worksheet();

my $format = $workbook->add_format();

$worksheet->set_column(0, 0, 5);
$worksheet->set_column(1, 3, 20);
$worksheet->set_column(4, 5, 50);
$worksheet->set_column(7, 7, 20);

$format->set_font('Verdana');
$format->set_align('top');

$row = $col = 0;

foreach my $bug (@bugs){
$col = 0;
$worksheet->write($row, $col, $bug->bug_id, $format);
$col += 1;
$worksheet->write($row, $col, $bug->short_desc, $format);
$col += 1;
$worksheet->write($row, $col, $bug->bug_status, $format);
$col += 1;
$worksheet->write($row, $col, $bug->resolution, $format);
$col += 1;
$worksheet->write($row, $col, $bug->reporter->identity, $format);
$col += 1;
$worksheet->write($row, $col, $bug->assigned_to->identity, $format);
$col += 1;
$worksheet->write($row, $col, $bug->keywords, $format);
$col += 1;
$x = $col;

$dbh = Bugzilla->dbh;
$sth = $dbh->prepare("SELECT * FROM longdescs WHERE bug_id = ?")
or die("Couldn't Prepare");

$sth->execute($bug->bug_id);

while( $resptr = $sth->fetchrow_hashref() ){
$col = $x;
$worksheet->write($row, $col, $resptr->{"bug_when"}, $format);
$col += 1;
$comment = $resptr->{"thetext"};
$comment =~ s/\s+$//;
$worksheet->write($row, $col, $comment, $format);
$row += 1;
}
}




Este CGI crea el fichero XLS en la ubicación que le hemos dado. Es importante recalcar que el usuario bajo el cual ejecuta Apache tenga permiso de escritura en ese directorio.

No creo que haya que explicar mucho del script pues es bastante explicito. Las lineas:

$worksheet->set_column(0, 0, 5);

Fijan el ancho de las columnas. Por lo visto, Excel hace esto automaticamente pero sólo en el momento de ejecución, por lo cual no se puede añadir esto como atributo.

El fichero XLS tiene la siguiente estructura:

ID | SUMMARY | STATUS | RESOLUTION | REPORTER | ASSIGNEE | COMMENTS

Para cada comentario se añade una nueva fila, lo cual permite una mejor presentación. Se pueden añadir o quitar columnas modificando el script.