中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 数据库开发 > 数据库综合
用Perl的WriteExcel从数据库生成电子数据表格文件
作者:佚名 时间:2004-07-09 10:40 出处:互连网 责编:chinaitpower
              摘要:用Perl的WriteExcel从数据库生成电子数据表格文件

  许多商业最终用户更喜欢使用目前流行的电子数据表格程序(如Microsoft Excel),而不是数据库功能或应用程序。尽管Excel可以用ODBC及相关技术来提取储存在Oracle数据库当中的数据,但想让用户建立一个环境来直接访问数据或是通过安装脚本来安装数据资源可能会不大合理。
  
  因此,对于程序开发人员来说,从储存在数据库中的数据生成一个电子数据表格,并通过e-mail或网站将其文档传回用户手中,是一个非常基本的一般要求。
  
  关于如何生成Excel电子数据表格,一个典型回答是,生成一个CSV(comma-separated values)文件,在这里每一个字段都用一个Text属性来说明,可能包含在引号里。这种情况下,这个文件作为原始数据被终端用户接受,终端用户在Excel下打开它,通过一个对话将数据正确的分解成电子数据表格中的单元格。
  
  也可能仅仅通过传送作为一个电子数据表格属性的公式(如“=A1+B1”),将这些公式写进电子数据表格,而这个公式只有在字段被准确读取到正确位置时才会有用。在这种情况下,没有格式化控制,当数据读入时,最终用户只能手工将一个电子数据表格重新格式化。
  
  一个Perl替代品
  现在有了一个非常有用的CSV文件的替代品。John McNamara创建了一个Perl模块,叫做Spreadsheet::WriteExcel,它能动态生成一个真正的、二进制的、Excel的电子数据表格文件。
  
  在这个模块中,你可以创建一个工作手册,并在其中加入工作表,然后直接写入工作表单元格。有许多格式化选项允许你改变字段数据的格式、黑体、对齐方式、字体、前景和背景颜色、填充图案以及边框。
  
  另外,Spreadsheet::WriteExcel可以改变字体,文字变形和旋转文字,插入位图,设置密码保护工作表,以及建立能用鼠标扩展的数据集合。当然还能够设置打印选项和页面暂停的功能。
  
  该模块还可以写标准输出数据,因此它可以在cgi-bin程序中使用。其他程序语言可以通过HTTP URL参照cgi-bin,来请求Excel电子数据表格电子数据表格。
  
  下面是一个例子,它用DBI从EMP表中提取数据并用公式和格式化生成一个Excel电子数据表格电子数据表格。
  
  use DBI;
  use Spreadsheet::WriteExcel;
  
  # connect to the local database
  my $dbh = DBI->connect('dbi:Oracle:','scott','tiger') || die $DBI::errstr;
  
  print "Generating Excel Spreadsheet\n";
  my $workbook = new Spreadsheet::WriteExcel "emp.xls";
  my $worksheet = $workbook->add_worksheet();
  my $fmt = {
    HEADER => $workbook->add_format(bold=>1,align=>'center',
      bottom=>2,bg_color=>'silver'),
    ENAME => $workbook->add_format(bold=>1,color=>'blue'),
    MONEY => $workbook->add_format(
      num_format=>'$#,##0.00',align=>'right'),
    TOTAL => $workbook->add_format(
      num_format=>'$#,##0.00',align=>'right',bold=>1,
      top=>2),
  };
  
  print "Querying Employees\n";
  my $sth = $dbh->prepare('select * from emp') || die $DBI::errstr;
  my $rc = $sth->execute;
  my $r = 1;
  $worksheet->write($r-1,0,'Employee',$fmt->{HEADER});
  $worksheet->write($r-1,1,'Salary',$fmt->{HEADER});
  $worksheet->write($r-1,2,'Commission',$fmt->{HEADER});
  $worksheet->write($r-1,3,'Total',$fmt->{HEADER});
  $r++;
  while (my $row = $sth->fetchrow_hashref)
  {
    $worksheet->write($r-1,0,$row->{ENAME},$fmt->{ENAME});
    $worksheet->write($r-1,1,$row->{SAL},$fmt->{MONEY});
    $worksheet->write($r-1,2,$row->{COMM},$fmt->{MONEY});
    $worksheet->write($r-1,3,"=B$r+C$r",$fmt->{MONEY});
    $r++;
  }
  $worksheet->write($r-1,0,',$fmt->{TOTAL});
  $worksheet->write($r-1,1,'=SUM(B2:B'.($r-1).')',$fmt->{TOTAL});
  $worksheet->write($r-1,2,'=SUM(C2:C'.($r-1).')',$fmt->{TOTAL});
  $worksheet->write($r-1,3,"=B$r+C$r",$fmt->{TOTAL});
  print "Processed " . ($r-2) ." rows\n";
  $sth->finish;
关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有