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;
} |
Partager