Transformation .csv/.xls en perl

Résolu
Bonjour,

Il y a quelques temps, j'avais demandé de l'aide sur la conversion d'un fichier .xls en .csv en perl. Et j'avais réussi à faire ma conversion grâce à vous. Maintenant, je dois faire l'inverse, c'est à dire passer un fichier .csv en .xls, toujours en perl.
J'aurais aimé savoir s'il y avait besoin d'une librairie dans ce cas-ci, comme j'avais eu besoin de la librairie "Spreadsheet::ParseExcel;" pour le cas précédent.
Merci d'avance de votre aide.
Configuration: Windows XP
Firefox 2.0.0.11

6 réponses

  1. Je suis novice en langage C et des forums.

    je souhaiterai "lire,crée,modifier" un .TXT converti en .CSV puis .XLS
    j'ai lu et essayer de comprendre les indications si dessus mais c'est pour moi du chinois.

    fichier .txt

    a;aa;aaa;aaaa;aaaaa;aaaaaa
    b;bb;bbb
    c;cc;ccc;cccc

    fichier .CSV

    -->matrice

    je pense que un rappel des bases (bibliotec... utiliser)

    use strict; ?????????
    use warnings; ??????????
    use Spreadsheet::WriteExcel; ????????

    merci d'avance
    1. Modérateur
      Salut,

      voici le fichier sur lequel j'ai tester, donc nombre de colonnes différent pour chaque ligne
      à toi d'adapter
      root@debian:~/src# cat fichier.csv
      a;aa;aaa;aaaa;aaaaa;aaaaaa
      b;bb;bbb
      c;cc;ccc;cccc
      root@debian:~/src# cat ccm2.pl
      #!/usr/bin/perl
      use strict;use warnings;
      use Spreadsheet::WriteExcel;
      
      open LIRE_CSV,"fichier.csv"
          or die "E/S : $!\n";
      
      my $classeur = Spreadsheet::WriteExcel->new("perl.xls");
      my $feuille = $classeur->add_worksheet();
      
      while(<LIRE_CSV>){
              chomp;
              my @tmp = split /;/,$_;
              my $c = 0; # colonne commence à zéro
              my $r = $. - 1; # le nombre de ligne correspond au nombre de lignes de .csv -  1 (commence à zéro)
              foreach my $e(@tmp){
                      print "$r, $c, $e\n"; # affiche à l'écran ligne, colonne, valeur (pour test) - facultatif
                      $feuille->write($r,$c,$e);
                      ++$c;
              }
      }
      __END__
      root@debian:~/src#

      1. Bon, j'avance petit à petit.
        J'ai réussi à faire ce que je voulais, mais pas dynamiquement.
        C'est à dire que je sais par avance le nombre de colonne qu'il y aura dans mon fichier excel lors de sa création, car je sais à l'avance combien de valeur sont délimité dans le fichier texte.
        Moi, ce que j'aimerais rendre automatique dans ce code, c'est d'obtenir le fichier excel, sans avoir renseigné en dur dans le code le nombre de variables et donc de colonne.
        Merci de votre aide.

        Voici où en ait mon code :

        use strict;
        use warnings;
        use Spreadsheet::WriteExcel;

        # Information du programme
        print "Vous devez insérer le fichier texte (avec séparateur à virgule) à la racine de C: avant de continuer le lancement du programme !\n";
        print "Si vous ne l'avez pas fait, quittez le programme !\n";
        system("pause");

        # Saisie du nom du fichier d'entrée
        print "Saisissez le nom du fichier texte ! ";
        chomp(my $name_file=<stdin>);
        print "Vous avez saisi : $name_file\n";

        # Saisie de l'extension du fichier d'entrée
        print "Saisissez l'extension du fichier texte ! ";
        chomp(my $name_extension=<stdin>);
        print "Vous avez saisi : $name_extension\n";

        # Initialisation des variables
        my $cpt;

        # Déclaration du fichier d'entrée
        # "unless" sert à détecter si le fichier existe ou non
        unless (open FILETEXT, my $file = "C:\\${name_file}.${name_extension}")
        {
        print "Fichier Texte inexistant.\nLe programme va fermer.\n";
        system("pause");
        # Fermeture du programme
        exit();
        }
        else
        {
        my $file = "C:\\${name_file}.${name_extension}";
        # Utilisation de la librairie WriteExcel
        my $excel = Spreadsheet::WriteExcel->new("C:\\${name_file}.xls");
        my $worksheet_excel = $excel->add_worksheet("Fichier Client");
        # Parcours du fichier texte
        while(my $ligne = <FILETEXT>)
        {
        # Association des variables aux valeurs à chaque fois qu'il rencontre un ";"
        my ($var1,$var2,$var3,$var4) = split /;/,$ligne;
        # Incrémentation du compteur
        $cpt++;
        # Suppression du retour chariot dans un champ
        $var4 =~s/\n//;
        # Affichage des variables dans les colonnes correspondantes
        $worksheet_excel -> write('A'.$cpt, $var1);
        $worksheet_excel -> write('B'.$cpt, $var2);
        $worksheet_excel -> write('C'.$cpt, $var3);
        $worksheet_excel -> write('D'.$cpt, $var4);
        }
        # Fermeture du fichier d'entrée
        close FILETEXT;
        }
        system("pause");
        1. Rebonjour,

          Donc par rapport à la question que j'ai posé, j'ai vu que je devais utiliser le module "Spreadsheet::WriteExcel;".
          Par rapport à mon projet, pour le moment, j'arrive à récupérer mes données du fichier csv et à créer mon fichier excel. Là où je bloque, c'est pour insérer mes données dans le fichier excel.
          Merci d'avance pour votre aide.

          Je vous mets mon code actuel ci-dessous :

          use strict;
          use warnings;
          use Spreadsheet::WriteExcel;

          # Information du programme
          print "Vous devez insérer le fichier texte (avec séparateur à virgule) à la racine de C: avant de continuer le lancement du programme !\n";
          print "Si vous ne l'avez pas fait, quittez le programme !\n";
          system("pause");

          # Saisie du nom du fichier d'entrée
          print "Saisissez le nom du fichier texte ! ";
          chomp(my $name_file=<stdin>);
          print "Vous avez saisi : $name_file\n";

          # Saisie de l'extension du fichier d'entrée
          print "Saisissez l'extension du fichier texte ! ";
          chomp(my $name_extension=<stdin>);
          print "Vous avez saisi : $name_extension\n";

          # Déclaration du fichier d'entrée
          # "unless" sert à détecter si le fichier existe ou non
          unless (open FILETEXT, my $file = "C:\\${name_file}.${name_extension}")
          {
          print "Fichier Texte inexistant.\nLe programme va fermer.\n";
          system("pause");
          # Fermeture du programme
          exit();
          }
          else
          {
          open FILEXLS,">C:\\${name_file}.xls";
          my $file = "C:\\${name_file}.${name_extension}";

          while(my $ligne = <FILETEXT>)
          {
          my ($numclt,$cleclt,$civclt,$nomclt) = split /;/,$ligne;
          print "$numclt\n$cleclt\n$civclt\n$nomclt\n";
          }

          # Fermeture du fichier d'entrée
          close FILETEXT;
          close FILEXLS;
          }

          system("pause");