Spreadsheet::ParseExcel

来源:互联网 发布:四选一数据选择器实验 编辑:程序博客网 时间:2024/05/17 06:57

Spreadsheet::ParseExcel是用于从excel中读取信息的模块,但是这个模块只适用于xls格式,即excel97-03;而要读取xlsx格式的话,即excel07之后的版本,则需要使用模块Spreadsheet::XLSX。这里只对Spreadsheet::ParseExcel的用法做个描述。

  1. 加载模块:
    use Spreadsheet::ParseExcel;
  2. 新建一个解析器对象,有以下三种方法:
    1. 只创建一个解析器对象:
      my $parser = Spreadsheet::ParseExcel->new();
    2. 当excel需要密码打开时,如下新建解析器对象(目前只支持一种加密方法:Office 97/2000 Compatible encryption):
      $parser = Spreadsheet::ParseExcel->new( Password => 'secret');
    3. 如果需要解析的文件较大时,可以采用回调函数的方法,免得被卡死:
          #!/usr/bin/perl -w    use strict;    use Spreadsheet::ParseExcel;    my $parser = Spreadsheet::ParseExcel->new(        CellHandler => \&cell_handler,        NotSetCell  => 1    );    my $workbook = $parser->parse('file.xls');    sub cell_handler {        my $workbook    = $_[0];        my $sheet_index = $_[1];        my $row         = $_[2];        my $col         = $_[3];        my $cell        = $_[4];        # 可以在这里边设定执行条件        return if $sheet_index >= 3;        return if $row >= 10;        # 也可以设定具体执行的行为。        print $cell->value(), "\n";    }
      其中:
      $workbook:表示具体的工作簿对象,可以包含Spreadsheet::ParseExcel::Workbook中的方法。
      $sheet_index:表示表格对象,从0开始。
      $row:表示行数,从0开始。
      $col:表示列数,从0开始。
      $cell:单元格对象的引用。即Spreadsheet::ParseExcel::Cell的对象。
      NotSetCell:设置为1表示不存储已经解析过的单元格信息。


  3. 解析工作簿,返回工作簿对象:
    my $workbook = $parser->parse('Book1.xls');
    如果出错的话,返回undef.,可以通过如下形式打印出错信息:
    if ( !defined $workbook ) {    die $parser->error(), ".\n";}
  4. 出错信息处理,有两种方法:
    1. 打印默认出错信息:
      $parser->error();
      其中error()和error_no()的对应关系如下:
      error()                         error_code()=======                         ============''                              0'File not found'                1'No Excel data found in file'   2'File is encrypted'             3
    2. 打印自定义出错信息:
      die "Got error code ", $parser->error_code, ".\n";
  5. 工作簿操作:
    my $workbook = $parser->parse('Book1.xls');
    工作簿支持一系列的方法,常用的方法列表如下:
    1. 返回表格页的列表,通常如下使用:
      for my $worksheet ( $workbook->worksheets() ) {...}
    2. 返回单个表格页,可以使用名字或索引值作参数:
      $worksheet = $workbook->worksheet('Sheet1');$worksheet = $workbook->worksheet(0);
    3. 返回表格页的数量:
      my $worksheet_count = $workbook->worksheet_count();
    4. 返回excel文件的名字:
      my $filename = $workbook->get_filename();
      更具体的信息在页面:http://search.cpan.org/~jmcnamara/Spreadsheet-ParseExcel-0.59/lib/Spreadsheet/ParseExcel/Workbook.pm
  6. 工作表操作:
    模块Spreadsheet::ParseExcel::Worksheet封装了一系列的工作表的属性,这里只描述常用的方法:
    1. 获得某个特定格的元素,没有的话,返回undef:
      my $cell = $worksheet->get_cell($row, $col);
    2. 获得行的范围:
       my ( $row_min, $row_max ) = $worksheet->row_range();
    3. 获得列的范围:
      my ( $col_min, $col_max ) = $worksheet->col_range();
    4. 获得工作表的名称:
      my $name = $worksheet->get_name();
      更具体的信息在http://search.cpan.org/~jmcnamara/Spreadsheet-ParseExcel-0.59/lib/Spreadsheet/ParseExcel/Worksheet.pm
  7. 表格元素操作:
    这里只描述常用的方法:
    1. 获取格式化后的数据:
      my $value = $cell->value();
      这里长日期格式(2011年11月1日)处理不正确,显示的是数字,而不是格式化后内容。
      这里的格式化的意思主要针对数字形式的单元格数据。比如数字的值是40117,就可能会被格式化为内容40,117,40117.000,甚至是时间格式2009/12/30。
      如果单元格不包含格式化的数字,则返回的内容和unformatted()一样。
      对于一个确定的单元格,value()总是返回一个值。
      在单元格具有格式的情况下,单元格内没内容则返回空。

    2. 获取未格式化的数据:
      my $unformatted = $cell->unformatted();
      返回非格式化的数字形式的数据。
      更具体的内容在http://search.cpan.org/~jmcnamara/Spreadsheet-ParseExcel-0.59/lib/Spreadsheet/ParseExcel/Cell.pm
  8. 还有一些东西不常用,就不写了。

更具体的内容在http://search.cpan.org/~jmcnamara/Spreadsheet-ParseExcel-0.59/lib/Spreadsheet/ParseExcel.pm


原创粉丝点击