此perl脚本参照博文
修正该脚本导出UTF8字符为乱码问题
需要安装的模块
Spreadsheet::WriteExcel
OLE::Storage_Lite
可从
www.cpan.org上下载相关模块,如果比较懒可以下载文章后的附件,并附一脚本安装相关模块,附件文件为
OLE-Storage_Lite-0.18.tar.gz
Spreadsheet-WriteExcel-2.25.tar.gz
getmysqldate.pl
脚本如下
#!/usr/bin/perl
use strict;
use DBI;
use Encode;
use Spreadsheet::WriteExcel::Big;
my hostname="localhost"; #主机
myhostname="localhost"; #主机
myusername="root";#用户名
my password="xxx";#密码
mypassword="xxx";#密码
mydbname=ARGV[1];#连接的数据库名称
myARGV[1];#连接的数据库名称
myport=3306;#端口号
use strict;
use DBI;
use Encode;
use Spreadsheet::WriteExcel::Big;
my hostname="localhost"; #主机
myhostname="localhost"; #主机
myusername="root";#用户名
my password="xxx";#密码
mypassword="xxx";#密码
mydbname=ARGV[1];#连接的数据库名称
myARGV[1];#连接的数据库名称
myport=3306;#端口号
#由于连接到数据库名需要经常变化所以我把数据库名定义为一变量,如果不定义也行执行sql语句的时候可以用mysql.user;这样的语句来定义到某个数据库
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 @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');
if (#ARGV != '2') #如果接收到的ARGV值不为2则执行提示语句
{
print qq~usage:#ARGV != '2') #如果接收到的ARGV值不为2则执行提示语句
{
print qq~usage:0 FILENAME.xls DBNAME "SQL STATEMENT" \n~;
exit;
}
{
print qq~usage:#ARGV != '2') #如果接收到的ARGV值不为2则执行提示语句
{
print qq~usage:0 FILENAME.xls DBNAME "SQL STATEMENT" \n~;
exit;
}
my scriptname=ARGV[0];
my sqlcmd=ARGV[2];
$sql_cmd=~ s/\"//g;
my sqlcmd=ARGV[2];
$sql_cmd=~ s/\"//g;
my dbh=DBI−>connect("dbi:mysql:database=dbname;host=hostname;port=port",username,password);
$dbh->do("set charset utf8;"); #mysql数据库是utf8编码,设置相同的编码方式,否则中文会乱码
my sth=dbh->prepare("sqlcmd")||diedbh->errstr;
my rows=sth->execute() or die sth−>errstr;mysql;
print "sqlcmdfindrows rows.\n";
my rows=sth->execute() or die sth−>errstr;mysql;
print "sqlcmdfindrows rows.\n";
my @cols_name = @{sth->{'NAME'}}; #从数据库查询结果的列名
if (#cols_name > #cols)
{
print "result table fields overflow!(max num. > ".(#cols+1).")\n";
exit;
}
if (#cols_name > #cols)
{
print "result table fields overflow!(max num. > ".(#cols+1).")\n";
exit;
}
print "write to excel..\n";
#创建表格文件
my excel=Spreadsheet::WriteExcel::Big−>new("ARGV[0]") || die "文件创建失败:$!";
#添加sheet页
my sheet=excel->add_worksheet('result');
my sheet=excel->add_worksheet('result');
#表的格式
my titlestyle=excel->add_format();
titlestyle−>setsize(11);title_style->set_bold();
$title_style->set_align('center');
my titlestyle=excel->add_format();
titlestyle−>setsize(11);title_style->set_bold();
$title_style->set_align('center');
my $sheet_col = 0; #sheet列
#将结果写入表格
for (my i=0;i<=#cols_name ;i++) #列信息
{
sheet−>setcolumn(cols[i],length(cols_name[i])+20);sheet->write(sheetcol,i,colsname[i],$title_style);
}
for (my i=0;i<=#cols_name ;i++) #列信息
{
sheet−>setcolumn(cols[i],length(cols_name[i])+20);sheet->write(sheetcol,i,colsname[i],$title_style);
}
#冻结表首行
$sheet->freeze_panes(1, 0);
$sheet->freeze_panes(1, 0);
while (my @row = sth->fetchrow_array)
{sheet_col++;
for (my i=0;i<=#cols_name ;i++)
{
next if (row[i] eq ''); #无信息,就不写入
{sheet_col++;
for (my i=0;i<=#cols_name ;i++)
{
next if (row[i] eq ''); #无信息,就不写入
Encode::_utf8_on(row[i]); #把row[i]当作utf8来处理sheet->write(sheetcol,i,row[i]);
}
}
}
}
print "finish!\n";
#脚本使用方法perl getmysqldate.pl fuck.xls information_schema "select * from tables;"
分号可有可无,但作为mysqlsql语法习惯了
本文转自 qwjhq 51CTO博客,原文链接:http://blog.51cto.com/bingdian/196150