我第一次使用Perl。我正在使用它从一个Excel文件中的多个单元格中获取数据,并将它们放在另一个现有的Excel文件中。
我设法从第一个文件中提取我需要的数据并将其放入@array中。我开始尝试将数据写入我需要的特定单元格中。
问题是当脚本运行时,它在所有单元格中具有相同的编号,18365。虽然@rows数组正常工作并将数字放在正确的单元格中,但@revenue数组仅打印最后一个数字。
我有什么东西可以忽视或不理解吗?有一个更好的方法吗?我提前谢谢你。
use warnings;
use strict;
use Spreadsheet::ParseExcel;
use Spreadsheet::ParseExcel::SaveParser;
my $parser = Spreadsheet::ParseExcel::SaveParser->new();
my $workbook = $parser->Parse('xls_test.xls');
if (!defined $workbook ) {
die $parser->error(), ".\n";
}
my $worksheet = $workbook->worksheet(0);
my @rows = (2, 10, 17);
my @revenue = (10200, 9025, 18365);
my $col = 2;
foreach my $rev (@revenue) {
foreach my $r (@rows) {
$worksheet->AddCell( $r, $col, "$rev" );
}
}
$workbook->SaveAs('xls_test.xls');
答案 0 :(得分:3)
如果你采取循环:
foreach my $rev (@revenue) {
foreach my $r (@rows) {
$worksheet->AddCell( $r, $col, "$rev" );
}
}
要写的最后一个$rev
是18365,您将覆盖所有3行中的先前值。
您可以做的是从列表中创建行到收入哈希并遍历它:
my @rows = (2, 10, 17);
my @revenue = (10200, 9025, 18365);
my $col = 2;
my %data;
for my $i (0 .. $#rows) {
$data{$rows[$i]} = $revenue[$i]; # row => revenue
}
foreach $row (keys %data) {
$worksheet->AddCell($row, $col, $data{$row});
}
答案 1 :(得分:2)
以下是您的代码所做的事情的说明。我将AddCell
替换为一个简单的say
,就像print
一样,最后有一个换行符。
use strict;
use warnings 'all';
use feature 'say';
my @rows = (2, 10, 17);
my @revenue = (10200, 9025, 18365);
my $col = 2;
say "row\tcol\trev";
foreach my $rev (@revenue) {
foreach my $r (@rows) {
say join "\t", $r, $col, $rev;
}
}
这是输出:
row col rev
2 2 10200
10 2 10200
17 2 10200
2 2 9025
10 2 9025
17 2 9025
2 2 18365
10 2 18365
17 2 18365
正如您所看到的,它会迭代所有收入,然后为每个收入写入第2行,第10行和第17行。
2 2 10200
10 2 10200
17 2 10200
又来了。
2 2 9025
10 2 9025
17 2 9025
由于它始终位于同一列(即2),因此值会被覆盖。这就是为什么只有最后一轮价值观的原因。
我真的不知道你期望什么是正确的输出,但既然你有固定的行,你可能想要使用三列?在为每个$col
编写所有行后,您可以增加$rev
变量。
foreach my $rev (@revenue) {
foreach my $r (@rows) {
$worksheet->AddCell( $r, $col, $rev );
}
$col++;
}
现在我们上面的小程序的输出将是这样的,所有值都将存在。
row col rev
2 2 10200
10 2 10200
17 2 10200
2 3 9025
10 3 9025
17 3 9025
2 4 18365
10 4 18365
17 4 18365
请注意,我删除了""
周围的双引号$rev
。你不需要引用这样的变量。