如何在perl中逐行读取.xlsm文件

时间:2017-12-14 05:38:47

标签: perl

这段代码从.xlsm文件中读取数据。这个读取数据逐个单元格,如单元格(0,0)等等,从这段代码我无法读取整行数据。我想阅读。 xlsm文件逐行,也只是指定的工作表不是全部。

#!/usr/bin/env perl
use strict;
use warnings;
use Spreadsheet::Reader::ExcelXML qw( :just_the_data);

my $workbook  = Spreadsheet::Reader::ExcelXML->new( file => 'filename.xlsm' 
);

if ( !$workbook->file_opened ) {
     die $workbook->error(), "\n";
 }

for my $worksheet ( $workbook->worksheets) {

    print "Reading worksheet named: " . $worksheet->get_name . "\n";

    while( 1 ){
            my $cell = $worksheet->get_next_value;

            print "Cell is: $cell\n";
            last if $cell eq 'EOF';
     }
 }

输出:

    # SYNOPSIS Screen Output
    # 01: Row, Col    = (0, 0)
    # 02: Value       = Category
    # 03: Unformatted = Category
    # 04:
    # 05: Row, Col    = (0, 1)
    # 06: Value       = Total
    # 07: Unformatted = Total
    # 08:
    # 09: Row, Col    = (0, 2)
    # 10: Value       = Date
    # 11: Unformatted = Date
    # 12:
    # 13: Row, Col    = (1, 0)
    # 14: Value       = Red
    # 16: Unformatted = Red
    # 17:
    # 18: Row, Col    = (1, 1)
    # 19: Value       = 5
    # 20: Unformatted = 5
    # 21:
    # 22: Row, Col    = (1, 2)
    # 23: Value       = 2017-2-14 #(shows as 2/14/2017 in the sheet)
    # 24: Unformatted = 41318
    # 25:
    # More intermediate rows ...
    # 82:
    # 83: Row, Col    = (6, 2)
    # 84: Value       = 2016-2-6 #(shows as 2/6/2016 in the sheet)
    # 85: Unformatted = 40944

1 个答案:

答案 0 :(得分:2)

根据文档,您可以使用fetchrow_arrayref上的fetchrow_arrayworkbook level方法获取完整行。

  

<强> fetchrow_arrayref( $row )

     

定义:为了向DBI致敬,我包含了这个函数来返回一个   请求的$行中的单元格或值的数组引用。如果没有行   请求返回'下一行'。在数组ref中任何空单元格   将显示为'undef'。

     

接受:undef = next | $ row =表示所需行的行整数   请参阅Spreadsheet :: Reader :: ExcelXML中的属性“count_from_zero”   了解$ row返回哪一行。

     

返回:该行中所有可能列位置的数组引用   根据属性“group_return_type”填写数据   电子表格::读卡器:: ExcelXML。

请注意,此模块有自己的行定义,您可以在导入时更改它。

要加载特定工作表,请使用工作簿对象上的worksheet方法。您需要事先知道工作表的名称,或者您可以使用get_sheet_names获取所有名称。

  

worksheet( $name )

     

定义:此方法将返回一个对象来读取值中的值   确定的工作表。如果没有值传递给$ name那么'next'   返回物理顺序的工作表。 'next'也不会包装它   只遍历工作簿中的“工作表”(不是   'chartsheets')。

     

接受:表示工作表名称的$ name字符串   你要打开的对象。此名称是选项卡上可见的单词   在Excel中打开电子表格。 (不是底层的zip成员文件   名称 - 可以是不同的。它不接受图表标签名称。)

     

返回:一个能够读取工作表的Worksheet对象   那个名字。如果a,它返回undef并设置error属性   请求'chartheet'。或者在“下一个”模式下,如果过去则返回undef   最后一张。

     

示例:使用隐含的“下一个”工作表;

这是一个快速,未经测试的示例,它将打开一个特定的工作表,逐行获取数据并转储结果。

use strict;
use warnings;
use Spreadsheet::Reader::ExcelXML qw( :just_the_data);
use Data::Dumper;

my $workbook  = Spreadsheet::Reader::ExcelXML->new( 
    file => 'filename.xlsm' );

my $worksheet = $workbook->worksheet('foo');

while (my $row = $worksheet->fetchrow_array_ref) {
    print Dumper $row;
}