Au sujet des tableurs

Anne tableurs csv

J’ai utilisé gnumeric, openoffice, libreoffice et même excel parfois, et utilisés à bon escient, ces outils sont vraiment pratiques.

J’ai aussi souvent généré automatiquement des fichiers csv, mais si la fonction principale est remplie, cela présente néanmoins quelques inconvénients :

  • on n’a qu’une feuille par CSV,
  • ce n’est pas beau (pas de mise en forme),
  • on n’a pas accès aux formules qui ont permis de faire les calculs dans le résultat. On pourrait penser que ce n’est pas très grave, mais cela nuit souvent à la compréhension de ce qui est calculé.

J’ai déjà essayé de générer du format excel à l’aide de la bibliothèque perl Spreadsheet::WriteExcel, mais j'étais tombée sur des problèmes, et son auteur m’avait conseillé de plutôt utiliser à Excel::Writer::XLSX, mais je n’avais pas eu le temps.

Je pense que maintenant, il est plus judicieux de générer du format ODS (Open Document Spreadsheet) qui fait partie de la famille des ODF. (Open Document Format).

J’ai donc essayé ODF::lpOD.

Génération de fichiers .ods avec perl et ODF::lpOD

#!/usr/bin/perl -w
use strict;
use ODF::lpOD;

Créer un document

Cette bibliothèque permet de créer différents types de document. Ici, on veut créer une table, et on spécifie donc spreadsheet :

my $doc = odf_document->create('spreadsheet');
my $contexte = $doc->get_body;

Par défaut, le document contient une feuille nommée Sheet1. Ici, on l’enlève pour commencer avec un document vide.

$contexte->clear;

Styles

Une des motivations pour générer du ods plutôt que du csv est la possibilité de faire de la mise en forme. Pour cela, il faut créer des styles. Un style est associé à un type d’objet. Le style table ne nous intéresse pas ici, car il spécifie l’extérieur de la table quand celle-ci est incluse dans un autre document (marges, alignement par rapport aux autres objets, etc). Les styles pertinents ici sont plutôt :

  • table row
  • table column
  • table cell

Les propriétés les plus utiles des deux premiers portent surtout sur le calcul de la hauteur et la largeur des cellules.

On s’intéresse ici aux styles de type table cell. Pour créer un style, il faut par exemple faire :

my $title_style = odf_style->create('table cell',
  name                => 'Titles',
  background_color    => 'light blue',
  border_bottom       => '1mm solid #0000FF'
  );

Puis, on peut lui ajouter des propriétés. Il faut savoir que les propriétés appartiennent à différentes catégories (area) à l’intérieur même du style. Ici, on modifie des propriétés de paragraph (alignement) :

$title_style->set_properties(
  area    => 'paragraph',
  align   => 'center'
  );

et de text (fontes, couleur du texte, etc) :

$title_style->set_properties(
  area      => 'text',
  weight    => 'bold',
  color     => 'navy blue'
  );

Pour utiliser un style, il faut l’associer au document :

$doc->register_style($title_style);

Pour plus d’information, voir la documentation.

Remplir la table

On s’intéresse uniquement à la construction d’une table, c’est-à-dire ni à la consultation, ni à la modification.

Pour plus d’information, voir la documentation.

On peut accéder aux cases par leur nom habituel (A1 par exemple). Ici, on change le contenu et le style des deux premières cases :

$feuille->get_cell("A1")->set_text("N");
$feuille->get_cell("A1")->set_style ($title_style);
$feuille->get_cell("B1")->set_text("N+1");
$feuille->get_cell("B1")->set_style ($title_style);

Mais on peut aussi accéder aux cases par leurs coordonnées (ligne, colonne) numérotées à partir de 0, ce qui est quand même plus pratique pour les boucles :

for (my $i = 1 ; $i < 10 ; $i++) {
  $feuille->get_cell($i, 0)->set_text($i);
  $feuille->get_cell($i, 1)->set_formula("= A" . ($i + 1) . " + 1");
  }

On remarque que pour insérer une formule, il faut utiliser set_formula au lieu de set_text.

Sauvegarde

Pour générer le document :

$doc->save(target => "test.ods");

Résultat

Voir le script complet.

Voir aussi :