1

我有以下 perl 代码来执行 sqlite 查询并将结果保存在文本文件中。但我想将结果保存在 Excel 表中。有什么办法可以做到吗?

#!/usr/local/bin/perl -w
use strict;
use DBI;
my $dbfile = 'C:\usage.db3';      # your database file
my $dbh = DBI->connect(          # connect to your database, create if needed
    "dbi:SQLite:dbname=$dbfile", # DSN: dbi, driver, database file
    "",                          # no user
    "",                          # no password
    { RaiseError => 1 },         # complain if something goes wrong
) or die $DBI::errstr;

#use Data::Dump::Streamer;


my $array1 = $dbh->selectall_arrayref("SELECT  USR.id,USR.name, ST.license FROM users USR, status ST, upd_ate UD WHERE UD.upt_id = (select max(p2.upt_id) from upd_ate p2) AND ST.id = USR.id AND ST.upt_id = UD.upt_id ORDER BY ST.license,USR.name");



open FILE, ">btc.txt" or die $!;


foreach my $Ilink (@$array1) {
my ($id, $name, $license) = @$Ilink;
print FILE "$id|$name|$license\n";
}
close FILE;

谢谢

4

2 回答 2

2

我使用Excel::Template模块实现了一些类似的目标:在我们的项目中,我们必须创建数百(甚至数千)个 .xls 格式的电子表格。这些电子表格具有相同的布局,但当然,内部的数据非常不同。)

我喜欢这个模块的总体思路:您创建一个模板文件(我们称之为license.xml),如下所示:

<workbook>
  <worksheet name="licenses">
    <loop name="license_data">
      <row>
        <cell text="$id"></cell>
        <cell text="$name"></cell>
        <cell text="$license"></cell>
      </row>
    </loop> 
  </worksheet>
</workbook>

...然后将一些数据传递给它,如下所示:

use strict;
use Excel::Template;

my $template = Excel::Template->new(
    filename => 'license.xml',
);

$template->param('license_data' => [
  { id => 1, name => 'John Doe', license => '77-77-7' },
  { id => 2, name => 'Jack Right', license => '88-88-8' }
]);

$template->write_file('license.xls');

……瞧!在此脚本的工作结束时,您有一个完整的 XLS 文件。)

更新:很久以前,我在这篇文章的第一版中完全弄乱了模板的语法。:( 现在它工作正常,我已经检查过了。)

此外,我还想提一下 Excel::Template 的能力有些有限(例如,插入合并单元格是一个非常复杂的过程)。我读过Excel::Template::Plus的能力更强,但还没有找到真正的任务来练习它。)

于 2012-06-20T21:29:05.313 回答
0

我使用DBI_to_Excel.pmfrom_dbi_to_excel.pl使用fbs_load.yml

于 2012-07-23T16:22:00.270 回答