convertir un fichier excel en texte ou csv
Cette procédure permet de convertir un fichier excel 2007 ou avant en fichier txt ou csv.
Le choix du séparateur est laissé à l'utilisateur.
si on précise un répertoire, le fichier convertit sera crée dans ce dernier, sinon, il sera crée dans le même répertoire que le fichier excel.
On peut choisir de convertir toutes les feuilles ou non du fichier excel en mettant -AllOnglets à 1 => tout sera convertit, ou à 0 et dans ce cas, à chaque feuille une confirmation sera demandée.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
| #!/usr/bin/perl
use warnings;
use strict;
use Carp;
my %Arguments = (
-fichier => 'path/fichier.xls',
-type => 'csv',
-separateur => "\t",
-repertoire => '.',
-AllOnglets => 0,
);
print ExcelToCsvTxt( \%Arguments );
# But : Convertit un fichier excel en txt ou csv
# Arguement : Une référence de hash
# Retourne : fichier txt ou csv
# Necessite : Spreadsheet::ParseExcel, Spreadsheet::XLSX et File::Basename
sub ExcelToCsvTxt {
my $RefArgument = shift;
my $FichierXls = $RefArgument->{-fichier};
my $Type = $RefArgument->{-type};
my $Repertoire = $RefArgument->{-repertoire};
my $Separateur = $RefArgument->{-separateur};
my $AllOnglets = $RefArgument->{-AllOnglets};
$AllOnglets = 1 unless defined $AllOnglets;
# vérification du fichier
unless ( defined $FichierXls and $FichierXls =~ /\.xlsx?$/i ) {
die <<'USAGE';
my %Arguments = (
-fichier => 'chemin/vers/fichier.xls',
-type => 'csv', # ou txt
-separateur => ';', # au choix
-repertoire => '.', # facultatif
-AllOnglets => 1, # ou 0 => demande confirmation
);
print ExcelToCsvTxt( \%Arguments );
USAGE
}
# vérification du type de conversion voulu
unless ( defined $Type and $Type =~ m{^csv|txt$}i ) {
$Type = 'txt';
}
require File::Basename;
# vérification du type de conversion voulu
unless ( defined $Repertoire and -d $Repertoire ) {
$Repertoire = File::Basename::dirname($FichierXls);
}
# Nouveau fichier
my (@FileParse) = File::Basename::fileparse( $FichierXls, qr/\.[^.]*/ );
my $FichierTxtCsv = $Repertoire . '/' . $FileParse[0] . ".$Type";
# On verifie si c'est un fichier excel version 2007 ou plus ancien
my $ExcelObj;
if ( $FichierXls =~ m{\.xls$}i ) {
require Spreadsheet::ParseExcel;
$ExcelObj = Spreadsheet::ParseExcel::Workbook->Parse($FichierXls)
or die("Impossible de lire le fichier $FichierXls\n");
}
else {
require Spreadsheet::XLSX;
$ExcelObj = Spreadsheet::XLSX->new($FichierXls)
or die("Impossible de lire le fichier $FichierXls\n");
}
# Nombre de feuilles dans le fichier excel
my $NbrFeuilles = scalar @{ $ExcelObj->{Worksheet} };
# Création du fichier final
open( my $fh, '>', $FichierTxtCsv )
or die "impossible de ceer le fichier $FichierTxtCsv\n";
my ( $iR, $iC, $ObjetFeuille, $oWkC );
foreach my $ObjetFeuille ( @{ $ExcelObj->{Worksheet} } ) {
if ( $NbrFeuilles > 1 and $AllOnglets != 1 ) {
print "Voulez vous convertir l'onglet '$ObjetFeuille->{Name}' [Y/n] : ";
chomp ( my $Reponse = <STDIN> );
print "\n";
next if ( defined $Reponse and uc($Reponse) eq 'N' )
}
# Parcours des lignes
for (
my $iR = $ObjetFeuille->{MinRow};
defined $ObjetFeuille->{MaxRow} && $iR <= $ObjetFeuille->{MaxRow};
$iR++
)
{
# Parcours des colonnes
for (
my $iC = $ObjetFeuille->{MinCol};
defined $ObjetFeuille->{MaxCol}
&& $iC <= $ObjetFeuille->{MaxCol};
$iC++
)
{
$oWkC = $ObjetFeuille->{Cells}[$iR][$iC];
if ( defined $oWkC ) {
print {$fh} $oWkC->Value, $Separateur;
}
else {
print {$fh} $Separateur;
}
}
print {$fh} "\n";
}
}
close($fh);
return $FichierTxtCsv;
} |