I took this from
Spreadsheet::XLSX's perldoc. Make sure modules and all dependencies are installed through CPAN, and I found perl 5.10 was needed due to a dependency on Weak References in Spreadsheet::ParseExcel.
#!/usr/bin/perl
# SSF 082110 - for perlmonks - convert XLSX to tab-delimited
use warnings;
use strict;
use Spreadsheet::XLSX;
use Text::Iconv;
my ($file,$sheetindex)=@ARGV;
die "Usage: $0 file.xlsx [sheetindex]\n" unless $file;
$sheetindex||=0;
my $converter=Text::Iconv->new("utf-8","windows-1251");
my $excel=Spreadsheet::XLSX->new($file,$converter);
my @sheets=@{$excel->{Worksheet}};
die "Bad sheet index: $sheetindex\n" if $sheetindex<0 or $sheetindex>$
+#sheets;
my $sheet=$sheets[$sheetindex];
$sheet->{MaxRow}||=$sheet->{MinRow};
for my $row ($sheet->{MinRow} .. $sheet->{MaxRow}) {
$sheet->{MaxCol}||=$sheet->{MinCol};
for my $col ($sheet->{MinCol}..$sheet->{MaxCol}) {
my $cell=$sheet->{Cells}[$row][$col];
if ($cell) {
print $cell->{Val};
}
print "\t" if $col<$sheet->{MaxCol};
}
print "\n";
}
exit;
Note that it only outputs one sheet, defaulting to the first. I've noticed that Excel's blank book has three sheets, so it is already three-dimensional. This script could use more error checking, but it works on a Linux system with the caveats listed above.
HTH,
SSF