[英]how to read .xlsm file line by line in perl
这段代码从.xlsm文件中读取数据。此代码像cell(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
根据文档,您可以在工作簿级别使用fetchrow_arrayref
和fetchrow_array
方法获得完整的行。
fetchrow_arrayref( $row )
定义:为了向DBI致敬,我包括了此函数以返回所请求的$ row中单元格或值的数组ref。 如果未请求任何行,则返回“下一个”行。 在数组ref中,任何空白单元格都将显示为“ undef”。
接受:undef = next | $ row =指示所需行的行整数请参阅Spreadsheet :: Reader :: ExcelXML中的属性“ count_from_zero”以了解为$ row返回的行。
返回:该行中所有可能列位置的数组引用,并按照Spreadsheet :: Reader :: ExcelXML中的属性“ group_return_type”填充数据。
请注意,此模块对行是什么有自己的定义,您可以在导入时进行更改。
若要加载特定的工作表,请在worksheet
簿对象上使用worksheet
方法。 您需要事先知道工作表的名称,或者可以使用get_sheet_names
获得所有名称。
worksheet( $name )
定义:此方法将返回一个对象,以读取标识的工作表中的值。 如果没有值传递给$ name,则返回物理顺序的“下一个”工作表。 “下一个”不会包装它也只会遍历工作簿中的“工作表”(而不是“图表”)。
接受:$ name字符串,表示要打开的工作表对象的名称。 该名称是在Excel中打开电子表格时在选项卡上可见的单词。 (不是基础的zip成员文件名-可以不同。它不接受图表选项卡的名称。)
返回:一个能够读取该名称的工作表的工作表对象。 如果请求“图表表”,它将返回undef并设置错误属性。 或者在“下一个”模式下,如果经过最后一张纸,则返回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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.