【问题标题】:Use Perl to select data from SQL database and place into Excel使用 Perl 从 SQL 数据库中选择数据并放入 Excel
【发布时间】:2016-02-10 07:44:17
【问题描述】:

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

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

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

我想运行脚本 #1 并将其输出到 Excel 文件中。我想我应该能够将上面的这两个脚本结合起来,但我不断收到“需要显式包”错误。 (我假设是因为我的变量前面没有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" );

【问题讨论】:

  • 如果您正确缩进代码,很容易看出$col1$col2 仅在循环范围内定义。此外,在使用 DBI 时,变量名称 $sth 通常是为语句句柄保留的,但您得到的是 arrayref 的 arrayref,因此您可能应该将其命名为其他名称。

标签: sql excel perl


【解决方案1】:

Excel::Writer::XLSX 模块为这样的场景提供了一个称为write_col() 的便捷方法:

write_col() 方法可用于写入一维或二维数据数组 一气呵成。这对于转换数据库的结果很有用 查询到 Excel 工作表。您必须传递对数组的引用 数据而不是数组本身。然后write() 方法是 为数据的每个元素调用。

连接到数据库并初始化电子表格对象后,您基本上可以将代码的输出部分减少到以下两行:

my $data = $dbh->selectall_arrayref("select col1, col2 from table");
$worksheet->write_col(0, 0, $data);

【讨论】:

    【解决方案2】:

    除了其他提及之外,我意识到您的查询仅旨在返回单行,但一般来说,如果您有多行,最好迭代 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();
    

    就目前而言,如果您的查询确实返回了多行,那么您似乎会一遍又一遍地将相同的值写入相同的单元格...

    也许这就是你想要的,但我想提一下。

    【讨论】:

      【解决方案3】:

      您的问题在变量范围内,特别是这里

       foreach my $ln (@$sth1) 
      { my($col1, $col2) = @$ln; print "$col1  $col2\n";}
      

      您在 foreach 循环中定义 col1 和 col2,因此它们的范围只是循环。然后尝试在不存在的地方使用它们。

      我会在 foreach 上方定义 col1 和 col2,例如

      my $col1;
      my $col2;
      foreach my $ln (@$sth1) 
      {($col1, $col2) = @$ln; print "$col1  $col2\n";}
      

      一个

      【讨论】:

      • 使用此代码,只有结果集的最后一行会被写入电子表格。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-21
      • 2011-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-29
      相关资源
      最近更新 更多