用Perl从Oracle导出百万级数据到Excel

发表于:2009-8-26 10:27

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:未知    来源:网络转载

#
Linux

  用Perloracle导出百万级数据到excel excel 2007 可以存放1048576行、16384列的数据;excel 2003大概是65535行 我从oracle中导出30万行60列的数据到excel中花了约8分钟。

  如果你还没有安装perl,按下面步骤

  步骤:

  1、下载并安装perl v5.8.8,可以使用perl -v查看是否安装成功

  2、输入PPM命令打开perl的包管理器。找到并更新DBI

  3、下载DBD-Oracle-1.17.zip解压到c:\perl  在命令行进入该目录执行: ppm install dbd-oracle.ppd 安装DBD-oracle;

  4、安装 Excel 模块,如果你能联网,直接使用如下命令即可:

  ppm install OLE::Storage_Lite

  ppm install Spreadsheet::ParseExcel

  ppm install Spreadsheet::WriteExcel4、将如下代码保存到d:\test.pl,更改里面的oracle的用户名和ip地址,以及端口号,以及sql语句

  5、在命令行进入d盘下执行:perl test.pl

  代码:

    $ENV{NLS_LANG} = 'AMERICAN_AMERICA.ZHS16GBK';
    use strict;
    use DBI;
    use Win32::OLE;
    use POSIX qw(strftime);my $now_string=strftime "%Y-%m-%d-%H-%M-%S", localtime;my $ti_s =strftime "%S", localtime;
    my $ti_m=strftime "%M", localtime;
    my $ti_h=strftime "%H", localtime;
    my $ti_old=$ti_s+($ti_m*60)+($ti_h*3600);
    my $excel_file = "d:\\$now_string".".xlsx";
    #在此修改你的sql
    my $sql  = "select * from table1";my($dbh,$sth,$row,$col,@field,$ele,$c_times,$residual,$cols,$cell_end);
    unlink $excel_file if (-e $excel_file);
    my $Excel = Win32::OLE->GetActiveObject('Excel.Application') || Win32::OLE->new('Excel.Application', 'Quit');
    my $Book = $Excel->Workbooks->add;
    my $Sheet = $Book->Worksheets(1);
    my @array_cols=("","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z");
    #在此修改你的oracle的用户名、密码、ip、端口,
    $dbh = DBI->connect('dbi:Oracle:',q{scott/tiger@(DESCRIPTION=(ADDRESS = (PROTOCOL = TCP)(HOST = 10.XXX.XXX.XXX)(PORT = 1521)) (CONNECT_DATA=(SERVICE_NAME = test)))},"");$sth = $dbh->prepare($sql);
    $sth->execute();
    $row=1;
    $cols=0;if (@field = $sth->fetchrow)
    {        $cols=scalar(@field);
            $c_times=int($cols/26);
            $residual=$cols%26;
            if ($cols<27)
            {
                    $cell_end = $array_cols[$cols];
            }
            else
            {
                    if ($residual == 0)
                    {
                            $cell_end = $array_cols[$c_times-1]."Z";
                    }
                    else
                    {
                            $cell_end = $array_cols[$c_times].$array_cols[$residual];
                    }
            }
            $Sheet->Range("A1:$cell_end$row")->{Value} = [@field];
            while(@field = $sth->fetchrow)
            {
                    $row++;
                    print ("正在导出第 $row 条记录!");
                    print ("\n");
                    $Sheet->Range("A$row:$cell_end$row")->{Value} = [@field];
            }
            $sth->finish();
            $dbh->disconnect();
            $Book->SaveAs($excel_file);
    }
    undef($Sheet);
    undef($Book);
    undef($Excel);my $now_string1=strftime "%Y-%m-%d-%H-%M-%S", localtime;
    my $ti_s1 =strftime "%S", localtime;
    my $ti_m1=strftime "%M", localtime;
    my $ti_h1=strftime "%H", localtime;
    my $ti_new=$ti_s1+($ti_m1*60)+($ti_h1*3600);print "************************************************************************\n\n";
    print"导出完成!开始时间:$now_string.\t结束时间:$now_string1 \n共耗时:\t";
    print $ti_new-$ti_old;
    print ("秒\n\n\n");
    print "************************************************************************\n\n";
    use Term::ReadKey;
    $| = 1;
    print "请按任意键退出...";
    <STDIN>;
    ReadMode 4; # Turn off controls keys
    while (! defined ReadKey(-1)) {}
    ReadMode 0; # Reset tty mode
    $| = 0;

《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号