use warnings; use diagnostics; use Spreadsheet::XLSX; use Text::CSV; my $excel = Spreadsheet::XLSX->new ("Sample.xlsx"); my $csv = Text::CSV->new ({ binary => 1, auto_diag => 1, eol => "\n" }); foreach my $sheet (@{$excel->{Worksheet}}) { printf ("Sheet: %s\n", $sheet->{Name}); #my @worksheet = qw(sheet1 sheet2); my $Minrow = 1; my $maxrow = $sheet->{MaxRow} || $Minrow; my @wanted_cols = (8, 9, 10, 20); open my $fh, ">", "new.csv" or die "new.csv: $!"; foreach my $row ($Minrow .. $maxrow) { $csv->print ($fh, [ map { $sheet->{Cells}[$row][$_]{Val} } @wanted_cols ]}; } close my $fh or die "new.csv: $!"; }