我是Perl的新手,所以我希望有人可以帮助我 我有两个Perl脚本
连接到我的sql2008数据库并从一个表中选择2列作为数组并使用foreach打印它们。
使用Excel :: Writer :: XLSX生成一个Excel文件,其中包含我在特定行和列中放置的任何字符串。
我想运行脚本#1并将其输出到Excel文件中。我想我应该能够将上面这两个脚本结合起来,但是我一直在考虑,需要明确的包#34;错误。 (我假设因为我的变量在他们面前没有my
)。我必须离开。寻求帮助。
这是我的代码不起作用:
use strict;
use DBI;
use Excel::Writer::XLSX;
# connect to the db
my $dbh = DBI->connect('dbi:ODBC:dbname', 'dblogin', 'dbpassword');
my $sth1 = $dbh->selectall_arrayref("
select col1, col2 from table");
foreach my $ln (@$sth1)
{ my($col1, $col2) = @$ln; print "$col1 $col2\n";}
my $workbook = Excel::Writer::XLSX->new( 'col1col2test.xlsx' );
my $worksheet = $workbook->add_worksheet();
$worksheet->write( "A1", "$col1" );
$worksheet->write( "A2", "$col2" );
答案 0 :(得分:1)
Excel::Writer::XLSX模块为这样的场景提供了一种称为write_col()
的便捷方法:
write_col()
方法可用于写入1D或2D数据数组 一气呵成。这对于转换数据库的结果很有用 查询到Excel工作表。您必须传递对该数组的引用 数据而不是数组本身。然后是write()
方法 调用了数据的每个元素。
连接到数据库并初始化电子表格对象后,您基本上可以将代码的输出部分减少到以下两行:
my $data = $dbh->selectall_arrayref("select col1, col2 from table");
$worksheet->write_col(0, 0, $data);
答案 1 :(得分:0)
除了其他提及,我意识到你的查询只是为了返回一行,但一般来说如果你有多行,最好迭代SQL然后生成输出:
use strict;
use DBI;
use Excel::Writer::XLSX;
# connect to the db
my $dbh = DBI->connect('dbi:ODBC:dbname', 'dblogin', 'dbpassword');
my $sth1 = $dbh->prepare(q{select col1, col2 from table});
$sth1->execute();
my $workbook = Excel::Writer::XLSX->new( 'col1col2test.xlsx' );
my $worksheet = $workbook->add_worksheet();
my $col = 0;
while (my ($col1, $col2) = $sth1->fetchrow_array) {
$worksheet->write(0, $col, $col1);
$worksheet->write(1, $col, $col2);
$col++; # maybe you really don't want this... I don't know
}
$sth1->finish;
$workbook->close();
就目前而言,如果您的查询确实返回了多行,那么您似乎会将相同的值反复写入相同的单元格...
也许这就是你想要的,但我想提一下。
答案 2 :(得分:-2)
你的问题在可变范围内,特别是在这里
foreach my $ln (@$sth1)
{ my($col1, $col2) = @$ln; print "$col1 $col2\n";}
你在foreach循环中定义col1和col2,所以它们的范围只是循环。然后尝试在外面使用它们,它们不存在。
我将col1和col2定义在foreach之上,例如
my $col1;
my $col2;
foreach my $ln (@$sth1)
{($col1, $col2) = @$ln; print "$col1 $col2\n";}
A