use 5.16.2; use warnings; sub usage { die "usage: $0 file.xlsx name [out.csv]\n"; } my $xls = shift or usage; my $sht = shift or usage; my $out = shift // $xls; $out =~ s/\.xlsx$/.csv/i; use Spreadsheet::Read; use Text::CSV_XS; my $csv = Text::CSV_XS->new ({ binary => 1, eol => "\r\n", auto_diag => 1 }); open my $fh, ">", $out or die "$out: $!\n"; my $book = ReadData ($xls) or die "$xls: $!\n"; my $sheet = $book->[$book->[0]{sheet}{$sht}]; foreach my $row (1 .. $sheet->{maxrow}) { $csv->print ($fh, [ Spreadsheet::Read::row ($sheet, $row) ]); } close $fh;