2014-09-25 3 views
0

Только что установленный Spreadsheet::ParseExcel модуль, но возникла проблема. См. Несколько связанных вопросов, но не точно то же самое.Perl Spreadsheet :: ParseExcel не может разобрать и вернуть undef

#!/usr/bin/perl -w                       

use strict; 
use warnings; 

use Spreadsheet::ParseExcel; 
use Data::Dumper; 

my $bill = $ARGV[0] || die "Usage: $0 bill.xlsx\n"; 
my $parser = Spreadsheet::ParseExcel->new(); 
my $workbook = $parser->parse('Book2.xlsx'); 
print Dumper $workbook; 

for my $worksheet ($workbook->worksheet()) { } 

Когда я запускаю сценарий Perl, я получил следующее сообщение об ошибке:

Can't call method "worksheet" on an undefined value at read.bill.xlsx.pl line 15. 

Так что я бросил $workbook, и получил:

$VAR1 = undef; 

и дамперы анализатор показывает некоторые данные. Это означает, что $parser->parse не удалось. Кто-нибудь знает, почему? Благодарю.

+0

из документов [Spreadsheet :: ParseExcel] (https://metacpan.org/pod/Spreadsheet::ParseExcel#DESCRIPTION). Модуль не может читать файлы в формате Excel 2007 Open XML XLSX. См. Модуль [Spreadsheet :: XLSX] (https://metacpan.org/pod/Spreadsheet::XLSX). – jm666

ответ

1

Как documentation suggest, вы должны проверить, если parse()undef вернулся и проверить сообщение об ошибке,

my $workbook = $parser->parse('Book2.xlsx') // die $parser->error(); 
+0

Спасибо за это, и я получил: данных Excel не найдено. Тем не менее, это подтверждает проблему $ parser-> parse. –

1

Попробуйте это:

#!/usr/bin/perl -w 

use strict; 
use Spreadsheet::ParseExcel; 

my $bill = $ARGV[0] || die "Usage: $0 bill.xlsx\n"; 
my $parser = Spreadsheet::ParseExcel->new(); 
my $workbook = $parser->parse('Book2.xls'); 

if (!defined $workbook) { 
    die $parser->error(), ".\n"; 
} 

for my $worksheet ($workbook->worksheets()) { 

} 
1

После прибегая к помощи вокруг, я нашел формат XLSX требует Spreadsheet :: XLSC вместо ParseExcel. Кроме того, функция синтаксического анализа принимает имя файла, тогда нет необходимости в параграфе $ parser-> parse.