这是我的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.
答案 0 :(得分:2)
错误信息非常清楚。您正在调用未定义值的方法(add_worksheet()
)。您在$workbook
上调用该方法,因此您需要调查该值的设置方式。它来自这一行:
my $workbook = Spreadsheet::WriteExcel->new('perl.xls');
所以值得查看Spreadsheet::WriteExcel中new()
方法的文档。它说:
如果由于文件权限或其他原因无法创建文件 原因,
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”。