无法在未定义的值上调用方法“add_worksheet”?

时间:2015-05-20 10:40:55

标签: excel perl cgi perl-module cgi-bin

这是我的cgi代码,perl.xls文件作为脚本存在于保存文件夹中。

 #!/usr/bin/perl
 print "Content-type: text/html\n\n";
 use CGI;
 use DBI;
 use Spreadsheet::WriteExcel;
 use strict;
 use warnings;
 use CGI::Carp qw(fatalsToBrowser);
 my $cgi = CGI->new;
 my $workbook = Spreadsheet::WriteExcel->new('perl.xls');
 my $worksheet = $workbook->add_worksheet();
 $worksheet->write(0,0,'value');

当我运行脚本时,我收到此错误

Software error:

Can't call method "add_worksheet" on an undefined value at /var/www/cgi-bin/excel.cgi line 17.

 For help, please send mail to the webmaster (root@localhost), giving this error message and the time and date of the error. 

1 个答案:

答案 0 :(得分:2)

错误信息非常清楚。您正在调用未定义值的方法(add_worksheet())。您在$workbook上调用该方法,因此您需要调查该值的设置方式。它来自这一行:

my $workbook = Spreadsheet::WriteExcel->new('perl.xls');

所以值得查看Spreadsheet::WriteExcelnew()方法的文档。它说:

  

如果由于文件权限或其他原因无法创建文件   原因,new将返回undef。因此,这是一个好习惯   在继续之前检查new的返回值。像往常一样Perl   如果存在文件创建错误,将设置变量$!。你会   另请参阅“DIAGNOSTICS”中详述的警告消息之一:

my $workbook  = Spreadsheet::WriteExcel->new('protected.xls');
die "Problems creating new Excel file: $!" unless defined $workbook;

我猜你的CGI程序正在尝试在没有所需权限的目录中编写文件。您可能希望为new()提供应创建文件的目录的完整路径。

还值得从文档中指出这一警告:

  

注意:此模块处于仅维护模式,将来会使用   只有bug修复才能更新。更新,功能更丰富的API   建议使用兼容的Excel::Writer::XLSX模块。看到,   “Migrating to Excel::Writer::XLSX”。