Chinaunix首页 | 论坛 | 博客
  • 博客访问: 496980
  • 博文数量: 401
  • 博客积分: 244
  • 博客等级: 入伍新兵
  • 技术积分: 2215
  • 用 户 组: 普通用户
  • 注册时间: 2012-08-04 10:02
文章分类

全部博文(401)

文章存档

2013年(37)

2012年(364)

分类: Python/Ruby

2013-03-10 09:57:29

原文地址:perl解析Excel表格 作者:developinglife

    在Windows上安装ActivePerl所需要的读取Excel文件一般用Win32::OLE,但对于跨平台来说,还是选择另外的 Spreadsheet::ParseExcel及Spreadsheet::WriteExcel最好。前者是读Excel文件用的,后者用于写Excel文件。Spreadsheet::ParseExcel只能读95-2003格式的Excel文档,对于office 2007 Excel则要安装Spreadsheet::XLSX。

1安装Spreadsheet模块:

点击(此处)折叠或打开

  1. ppm install OLE::Storage_Lite #如果不安装这个,后面两个安装不了
  2. ppm install Spreadsheet::ParseExcel
  3. ppm install Spreadsheet::WriteExcel
   此时在PERL_HOME/site/lib下多了一个Spreadsheet模块。

2 查看模块是否安装成功以及其说明文档

点击(此处)折叠或打开

  1. perldoc Spreadsheet::ParseExcel
   此时如果显示其说明文档,则安装成功,否则失败。

3小试牛刀
    运行它的示例程序:

点击(此处)折叠或打开

  1. use strict;
  2.     use Spreadsheet::ParseExcel;
  3.      
  4.     my $parser = Spreadsheet::ParseExcel->new();
  5.     my $workbook = $parser->parse('Book.xls');
  6.      
  7.     if ( !defined $workbook ) {
  8.         die $parser->error(), ".\n";
  9.     }
  10.      
  11.     for my $worksheet ( $workbook->worksheets() ) {
  12.      
  13.         my ( $row_min, $row_max ) = $worksheet->row_range();
  14.         my ( $col_min, $col_max ) = $worksheet->col_range();
  15.      
  16.         for my $row ( $row_min .. $row_max ) {
  17.             for my $col ( $col_min .. $col_max ) {
  18.      
  19.                 my $cell = $worksheet->get_cell( $row, $col );
  20.                 next unless $cell;
  21.      
  22.                 print "Row, Col = ($row, $col)\n";
  23.                 print "Value = ", $cell->value(), "\n";
  24.                 print "\n";
  25.             }
  26.         }
  27.     }

显示结果:

     中文是乱码,这个问题如下解决:
4 安装字符编码模块Unicode::Map

点击(此处)折叠或打开

  1. ppm install Unicode::Map
5 程序中设置字符编码格式,按此格式解析,完整程序如下:

点击(此处)折叠或打开

  1. use strict;
  2.     use Spreadsheet::ParseExcel;
  3.     use Spreadsheet::ParseExcel::FmtUnicode; #字符编码
  4.      
  5.     my $parser = Spreadsheet::ParseExcel->new();
  6.     my $formatter = Spreadsheet::ParseExcel::FmtUnicode->new(Unicode_Map=>"CP936");#设置字符编码
  7.     #my $workbook = $parser->parse('Book.xls');
  8.     my $workbook = $parser->parse('Book.xls', $formatter);#按所设置的字符编码解析
  9.      
  10.     if ( !defined $workbook ) {
  11.         die $parser->error(), ".\n";
  12.     }
  13.      for my $worksheet ( $workbook->worksheets() ) {
  14.      
  15.         my ( $row_min, $row_max ) = $worksheet->row_range();
  16.         my ( $col_min, $col_max ) = $worksheet->col_range();
  17.      
  18.         for my $row ( $row_min .. $row_max ) {
  19.             for my $col ( $col_min .. $col_max ) {
  20.      
  21.                 my $cell = $worksheet->get_cell( $row, $col );
  22.                 next unless $cell;
  23.                 print $cell->value()," ";
  24.             }
  25.             print "\n";
  26.         }
  27.     }
ok,显示正常:




阅读(982) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~