使用Perl从SQL数据库中选择数据并放入Excel

时间:2016-02-09 23:09:21

标签: sql excel perl

我是Perl的新手,所以我希望有人可以帮助我 我有两个Perl脚本

  1. 连接到我的sql2008数据库并从一个表中选择2列作为数组并使用foreach打印它们。

  2. 使用Excel :: Writer :: XLSX生成一个Excel文件,其中包含我在特定行和列中放置的任何字符串。

  3. 我想运行脚本#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" );
    

3 个答案:

答案 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