工作簿:子程序中无法访问的动态工作表

问题描述 投票:0回答:0

所以我在名为 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 子例程中的对象变量,它们是但无法在该子例程之外访问它们。

非常感谢任何帮助。我假设我错误地传递了它或者没有取消引用它。

excel perl subroutine worksheet
© www.soinside.com 2019 - 2024. All rights reserved.