Aufruf aus der Konsole:

1
perl xls2csv.pl datei.xls

Und hier das Script „xls2csv.pl“

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
#!/usr/bin/perl

##
# Excel-Dateien (.xls) in CSV-Dateien umwandeln
#
# (c) 11.12.2009 by: H.-Peter Pfeufer @ BPA
##

use strict;
use warnings;

use Data::Dumper;

use Spreadsheet::ParseExcel;
use Getopt::Long 2.24, qw(:config bundling no_ignore_case no_auto_abbrev);
use Pod::Usage;

Getopt::Long::GetOptions(
    'h|help'        => sub { pod2usage( -verbose => 1 ) },
    'man'           => sub { pod2usage( -verbose => 2 ) },
    's|suffix=s'    => \(my $opt_suffix = '.csv'),
    'S|sep=s'       => \(my $opt_separator = '|'),
    'v|verbose'     => \(my $opt_verbose),
) or pod2usage();

my %config  = (
    'xlsDir'    => 'xls/',
    'csvDir'    => 'csv/',
);

print Dumper(\%config);

my $excel   = Spreadsheet::ParseExcel->new();

for (@ARGV) {
    my $excelName   = $_;

    die "Scriptabbruch:\n\tBitte die Datei im Verzeichnis '$config{'xlsDir'}' hinterlegen und ohne Pfad dem Script uebergeben.\n" if($excelName =~ /\//);

    my $inputfile   = $config{'xlsDir'} . $excelName;
    my $csvName     = $excelName;
    $csvName        =~ s/\.xls$/$opt_suffix/gs;

    print "Excel-Datei:\t'$config{'xlsDir'}$excelName'\n";
    print "CSV-Datei:\t'$config{'csvDir'}$csvName'\n";

    my $book        = $excel->Parse($inputfile);
    my $last_sheet  = $book->{SheetCount} - 1;

    for my $worksheet (@{$book->{Worksheet}}[0 .. $last_sheet]) {
        next
        if not defined $worksheet->{MaxRow}
        or not defined $worksheet->{MaxCol};

        print $worksheet->{Name} . "\n" if $opt_verbose;

        my $filename    = $config{'csvDir'} . $csvName;
        open my $fh, ">", $filename
        or die "Can open $filename to write: $!\n";

        my @row     = $worksheet->{MinRow} .. $worksheet->{MaxRow};
        my @col     = $worksheet->{MinCol} .. $worksheet->{MaxCol};

        for my $row (@{ $worksheet->{Cells}}[@row]) {
            my @cellvalue = map {
                $_      = $_->Value() if ref $_;
                $_      = '' if not defined $_;
                $_;
            } @$row[ @col ];
            print $fh join($opt_separator, @cellvalue), "\n";
        }
    }
}

print 'Done' . "\n";

Schreibe einen Kommentar

Ihre Email-Adresse wird nicht veröffentlicht. Pflichtfelder sind durch * markiert.

Sie können folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>