所以我在名为 CreateWorkbook 的子例程中创建工作簿,使用 SQL 查询动态添加工作表,并将工作表分配给 %ws 对象。导出时,工作簿具有所有选项卡。
但是,我在另一个子例程中访问这些工作表时遇到问题。请参阅下面的代码
use Excel::Writer::XLSX;
use strict;
use warnings;
use Data::Dumper;
my @lang_ids;
my @lang_types_ids;
sub run {
my ($self, $app_id, $filepath, $args) = @_;
my $workbook = CreateWorkbook($filepath, $app_id, $report_type, $lang_ids);
return {};
}
这个使用所有可用的语言创建工作簿和工作表,如:英语、西班牙语、德语等。 各个工作表是由正在传递的对象 %ws 引用的。如果我硬编码 $ws{test},那效果很好。 动态 $ws{\$final_name} 正在添加具有正确名称的工作表,例如 $ws{spanish} 当我导出 excel 时,我可以看到所有单独的选项卡。
sub CreateWorkbook {
my ($filepath, $app_id, $report_type, $lang_ids) = @_;
#print "Print filepath: $filepath \n";
my $sth;
my $workbook_writer = Excel::Writer::XLSX->new($filepath);
die "Problems creating new Excel file: $!" unless defined $workbook_writer;
my %fmt;
$fmt{fmt_normal} = $workbook_writer->add_format(num_format => '@');
$fmt{fmt_normal}->set_size(11);
my %ws;
#this line works great and I'm able to access it in subroutine
$ws{test} = $workbook_writer->add_worksheet('test');
foreach my $lang_id (@lang_ids) {
$sth = $app_id->_dbh->prepare(
"SELECT name FROM languages where id = ?")
|| die("Problem preparing query");
$sth->execute($lang_id) || die("Problem executing query");
while ( my $name = $sth->fetchrow_array ) {
$name=~s/ /_/g;
my $final_name = lc $name;
#line below adds worksheet to workbook but cannot be accessed in subroutine
$ws{\$final_name} = $workbook_writer->add_worksheet($name);
}
}
$workbook_writer->close() or die "Error closing file: $!";
return {
fmt => \%fmt,
ws => \%ws,
workbook_writer => $workbook_writer,
};
这就是问题所在,访问 $ws{test} 可以正常工作,但我无法访问 $ws{\$final_name} 即使我硬编码像 $ws{spanish}
这样的值sub add_data {
my ($app_id, $workbook, $report_type, $lang_ids, $lang_types_ids) = @_;
my %fmt = %{ $workbook->{fmt} };
my %ws = %{ $workbook->{ws} };
my %workbook_writer = %{ $workbook->{workbook_writer} };
my $sth;
my $sth2;
foreach my $lang_id (@lang_ids) {
$sth = $app_id->_dbh->prepare(
"SELECT name FROM languages where id = ?")
|| die("Problem preparing query");
$sth->execute($lang_id) || die("Problem executing query");
while ( my $name = $sth->fetchrow_array ) {
$name=~s/ /_/g;
my $final_name = lc $name;
#THIS WORKS FINE
$ws{test}->write( 0, $languages, $name . " - " . $lang_id, $fmt{fmt_normal} );
#ERROR: cannot call write method on undefined
$ws{\$final_name}->write( 0, $languages, $name . " - " . $lang_id, $fmt{fmt_normal} );
}
}
}
我在这上面花了太多时间。我检查了这些工作表是否已分配给 CreateWorkbook 子例程中的对象变量,它们是但无法在该子例程之外访问它们。
非常感谢任何帮助。我假设我错误地传递了它或者没有取消引用它。