sub _load_xls ($) { my ($fname) = shift; return undef unless (-e $fname); my ($parse) = Spreadsheet::ParseExcel->new(); my ($excel) = $parse->Parse($fname); my (%data); for (my $sheetcount = 0; $sheetcount < $excel->{SheetCount}; $sheetcount++) { my ($sheet) = $excel->{Worksheet}[$sheetcount]; my (@fields, @data); for (my $field = $sheet->{MinCol}; defined $sheet->{MinCol} && $field <= $sheet->{MaxCol}; $field++) { my ($cell) = $sheet->{Cells}[$sheet->{MinRow}][$field]; push (@fields, $cell->Value) if ($cell); }; for (my $row = $sheet->{MinRow} + 1; defined $sheet->{MinRow} && $row <= $sheet->{MaxRow}; $row++) { my (%item); for (my $col = $sheet->{MinCol}; defined $sheet->{MinCol} && $col <= $sheet->{MaxCol}; $col++) { my ($cell) = $sheet->{Cells}[$row][$col]; $item{$fields[$col - $sheet->{MinCol}]} = $cell->Value if ($cell); }; push (@data, \%item); }; $data{$sheet->{Name}} = { 'fields' => \@fields, 'data' => \@data, }; }; return (\%data); };