| 導購 | 订阅 | 在线投稿
分享
 
 
 

用Perl的WriteExcel从数据库生成电子数据表格文件

2008-05-19 08:57:42  編輯來源:互聯網  简体版  手機版  評論  字體: ||
 
 
  许多商业最终用户更喜欢使用目前流行的电子数据表格程序(如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;

  
 
 
 
  许多商业最终用户更喜欢使用目前流行的电子数据表格程序(如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;   
󰈣󰈤
日版宠物情人插曲《Winding Road》歌词

日版宠物情人2017的插曲,很带节奏感,日语的,女生唱的。 最后听见是在第8集的时候女主手割伤了,然后男主用嘴帮她吸了一下,插曲就出来了。 歌手:Def...

兄弟共妻,我成了他们夜里的美食

老钟家的两个儿子很特别,就是跟其他的人不太一样,魔一般的执着。兄弟俩都到了要结婚的年龄了,不管自家老爹怎么磨破嘴皮子,兄弟俩说不娶就不娶,老父母为兄弟两操碎了心...

 
 
>>返回首頁<<
 
 
 
 
 熱帖排行
 
 
王朝网络微信公众号
微信扫码关注本站公众号 wangchaonetcn
 
  免责声明:本文仅代表作者个人观点,与王朝网络无关。王朝网络登载此文出于传递更多信息之目的,并不意味著赞同其观点或证实其描述,其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有