首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在perl中逐行读取.xlsm文件

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

Stack Overflow用户
提问于 2017-12-14 05:38:47
回答 1查看 760关注 0票数 1

这段代码从.xlsm文件中读取数据,.this读取每个单元格的数据,比如单元格(0,0)等等,从这段代码中,我无法读取全行的数据,.I希望逐行读取.xlsm文件,而且也只能读取指定工作表的数据,而不是全部。

代码语言:javascript
复制
#!/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';
     }
 }

产出:

代码语言:javascript
复制
    # 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
EN

回答 1

Stack Overflow用户

发布于 2017-12-14 07:49:04

根据文档,您可以使用fetchrow_arrayreffetchrow_array方法在工作簿级上获得完整的行。

fetchrow_arrayref( $row ) 定义:在对DBI的敬意中,我包含了这个函数,以返回请求的$row中单元格或值的数组引用。如果没有请求行,则返回“next”行。在数组ref中,任何空单元格都将显示为'undef‘。 接受: undef =next\ $row =指示所需行的行整数,请参阅电子表格中的属性"count_from_zero“::$row::ExcelXML以了解为$row返回的行。 返回:该行中所有可能的列位置的数组参考,并根据电子表格::Reader::ExcelXML中的属性"group_return_type“填充数据。

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

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

worksheet( $name ) 定义:此方法将返回一个对象来读取标识的工作表中的值。如果没有值传递给$name,则返回物理顺序的“next”工作表。“‘next”不会包装它,它只会遍历工作簿中的“工作表”(而不是“图表表”)。 接受:表示要打开的工作表对象的名称的$name字符串。此名称是在Excel中打开电子表格时在选项卡上可见的单词。(不是基础zip成员文件名-这可能是不同的。它将不接受图表选项卡名。) 返回:具有读取该名称工作表的能力的工作表对象。如果请求“图表表”,则返回undef并设置错误属性。或者在“next”模式下,如果超过最后一个工作表,则返回undef。 示例:使用隐含的“下一步”工作表;

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

代码语言:javascript
复制
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;
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47806533

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档