本脚本功能:

从数据库获取数据并且写入excel文件;(据官网显示已经废弃此模块)

改用 Spreadsheet::ParseExcel及Spreadsheet::WriteExcel最好。前者是读Excel文件用的,后者用于写Excel文件。Spreadsheet::ParseExcel只能读95-2003格式的Excel文档,对于office 2007 Excel则要安装Spreadsheet::XLSX

#!/usr/bin/env perl
use strict;
use DBI;
use Encode;
use OLE::Storage_Lite;
use Spreadsheet::WriteExcel::Big;

#数据库信息
my $host = {
    user => 'root',
    pass => '123456',
    host => '127.0.0.1',
    database => 'aries_host_info',
    port => 3306,
    table=>'host',
};

#输出文件格式
my ($sec,$min,$hour,$mday,$mon,$year) = (localtime)[0..5];
($sec,$min,$hour,$mday,$mon,$year) = (
sprintf("%02d", $sec),
sprintf("%02d", $min),
sprintf("%02d", $hour),
sprintf("%02d", $mday),
sprintf("%02d", $mon + 1),
$year + 1900
);
my $date="$year$mon$mday$hour$min";

#输出excel名字  邮件实体附件
my $excel_file="${date}.xls";


my @cols=('A:A','B:B','C:C','D:D','E:E','F:F','G:G','H:H','I:I','J:J',
'K:K','L:L','M:M','N:N','O:O','P:P','Q:Q','R:R','S:S','T:T','U:U',
'V:V','W:W','X:X','Y:Y','Z:Z','AA:A','BB:B','CC:C','DD:D','EE:E',
'FF:F','GG:G','HH:H','II:I','JJ:J','KK:K','LL:L','MM:M','NN:N',
'OO:O','PP:P','QQ:Q','RR:R','SS:S','TT:T','UU:U','VV:V','WW:W',
'XX:X','YY:Y','ZZ:Z');

#连接数据库
my $dbh=DBI->connect("DBI:mysql:$host->{database};host=$host->{host};port=$host->{port}",$host->{user},$host->{pass},{RaiseError=>1});

#设置字符集
$dbh->do ("set character_set_client = 'utf8'");
$dbh->do ("set character_set_connection = 'utf8'");
$dbh->do ("set character_set_results = 'utf8'");

#sql 语句
my $sql=qq(select * from $host->{table};);
my $sth=$dbh->prepare($sql) or die 'Unable to perpare our query:'.$dbh->errstr."\n";
my $results=$sth->execute() or die 'Unable to execute our query:'.$dbh->errstr."\n";

#打印出sql的select行数到桌面、
if ($results == 0){
    print "查询结果 : N/A";
}else{
#print "$sql cmd find $results rows.\n";
    print "查询结果:$results 行.\n";
    }

#从数据库查询结果的列名
my @cols_name = @{$sth->{'NAME'}};

if ($#cols_name > $#cols)
{
print "result table fields overflow!(max num. > ".($#cols+1).")\n";
exit;
}
print "正在写入excel...\n";

#创建excel文件
my $excel = Spreadsheet::WriteExcel::Big->new($excel_file) || die "excel 文件创建失败: $!";

#创建 excel sheet
my $sheet = $excel->add_worksheet('anbound');

#excel文件格式
my $title_style = $excel->add_format();
$title_style->set_size(11);
$title_style->set_bold();
$title_style->set_align('center');
my $sheet_col = 0;   #列信息


#将结果输出到excel 文件
for (my $i=0; $i<scalar @cols_name ;$i++)   #列信息
{
$sheet->set_column($cols[$i], length($cols_name[$i])+20);
$sheet->write($sheet_col,$i,$cols_name[$i],$title_style);
}

#冻结表首行
$sheet->freeze_panes(1, 0);

while (my @row = $sth->fetchrow_array)
{
        $sheet_col++;
        for (my $i=0; $i< scalar @cols_name ;$i++)
        {
                next if ($row[$i] eq '');             #无信息,就不写入
                Encode::_utf8_on($row[$i]);         #把$row[i]当作utf8来处理
                $sheet->write($sheet_col, $i,$row[$i]); 
        }
}
print "excel写入完成!\n";