开发者社区> 科技小能手> 正文

用perl实现从mysql数据库里导出数据到excel

简介:
+关注继续查看
此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"; #主机
my $username="root";#用户名
my $password="xxx";#密码
my $dbname=$ARGV[1];#连接的数据库名称
my $port=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');
if ($#ARGV != '2') #如果接收到的ARGV值不为2则执行提示语句
{
print qq~usage: $0  FILENAME.xls DBNAME "SQL STATEMENT" \n~;
exit;
}
my $script_name=$ARGV[0];
my $sql_cmd=$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("$sql_cmd") || die $dbh->errstr;
my $rows = $sth->execute() or die $sth->errstr;
my $sql;
print "$sql cmd find $rows rows.\n";
my @cols_name = @{$sth->{'NAME'}}; #从数据库查询结果的列名
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 $title_style = $excel->add_format();
$title_style->set_size(11);
$title_style->set_bold();
$title_style->set_align('center');
my $sheet_col = 0; #sheet列
#将结果写入表格
for (my $i=0;$i<=$#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<=$#cols_name ;$i++)
        {
                next if ($row[$i] eq ''); #无信息,就不写入
                Encode::_utf8_on($row[$i]); #把$row[i]当作utf8来处理
  $sheet->write($sheet_col, $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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
MySql字符串拆分实现split功能(字段分割转列、转行)
MySql字符串拆分实现split功能(字段分割转列、转行)
1553 0
MySQL日志(undo log 和 redo log 实现事务的原子性/持久性/一致性)
MySQL日志(undo log 和 redo log 实现事务的原子性/持久性/一致性)
180 0
C语言连接并实现对MySQL的增删改查
C语言访问数据库并不如Java、Python那般容易。本文介绍C语言连接并实现对MySQL的增删改查的方法。
198 0
基于 Docker 结合 Canal 实现 MySQL 实时增量数据传输
基于 Docker 结合 Canal 实现 MySQL 实时增量数据传输
243 0
手把手教你Prometheus + Granafa实现mysql 性能监测部署
数据库性能监控可以说是十分重要,能否自行搭建环境实现像阿里云或是腾讯云那样直观的展示不同维度数据的功能?答案是肯定的。下面详细说明一下安装部署过程以及过程中出现的问题,希望对你有所帮助!
255 0
mysql实现一次将多条不同sql查询结果并封装到一个结果集
最近遇到一个统计查询需求,要求一次性查询多个统计信息,其中两个查询信息不在一个表中,也没有业务关联,表中也没有做连接处理。不考虑产品设计是否合理,完全是实际需求如此,需要一次性查询出来返回给前端进行展示,对于这种“非常规”的统计查询平常肯定会遇见,感觉有点代表性,所以简单记录一下。希望对有相同需求的同学可以作为参考。
149 0
脚本实现:从 HIVE 中导入数据到 MYSQL
脚本实现:从 HIVE 中导入数据到 MYSQL
132 0
Linux:Ubuntu安装jdk、tomcat、mysql,以及实现Tomcat开机自启动
Linux:Ubuntu安装jdk、tomcat、mysql,以及实现Tomcat开机自启动
142 0
10.【canal】canal从入门到放弃-mysql+canal+rocketmq实现数据库同步-canal简单使用
【canal】canal从入门到放弃-mysql+canal+rocketmq实现数据库同步-canal简单使用
220 0
+关注
科技小能手
文章
问答
视频
文章排行榜
最热
最新
相关电子书
更多
高效MySQL的N个习惯
立即下载
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
相关镜像