Perl如何通过工作表名称而非编号读取Excel文件内容
实现方案
你代码的核心错误是Spreadsheet::Read的ReadData返回值为数组引用结构,不支持->sheet()对象调用方法,按以下两种方式修改即可实现按工作表名称读取:
方法1:继续使用现有Spreadsheet::Read模块
无需更换依赖,利用返回结构中的元数据映射工作表名即可:
use Spreadsheet::Read qw(ReadData rows); my $book = ReadData ("test.xls"); # 从工作簿元信息中获取表名对应的序号 my $sheet_idx = $book->[0]{sheet}{name_3}; die "指定工作表name_3不存在" unless defined $sheet_idx; # 按序号获取工作表 my $sheet = $book->[$sheet_idx]; my @rows = rows ($sheet); # 后续处理行数据
方法2:切换为Spreadsheet::ParseExcel模块
如果后续需要更精细化的Excel操作,可使用该模块直接支持按名称取工作表:
use Spreadsheet::ParseExcel; my $parser = Spreadsheet::ParseExcel->new(); my $workbook = $parser->parse('test.xls'); die "Excel文件解析失败:" . $parser->error() unless defined $workbook; # 直接通过名称获取工作表 my $worksheet = $workbook->worksheet('name_3'); die "指定工作表name_3不存在" unless defined $worksheet; # 遍历读取所有行数据 my ($row_min, $row_max) = $worksheet->row_range(); my ($col_min, $col_max) = $worksheet->col_range(); for my $row ($row_min .. $row_max) { my @current_row; for my $col ($col_min .. $col_max) { my $cell = $worksheet->get_cell($row, $col); push @current_row, $cell ? $cell->value() : ''; } # 此处处理当前行数据@current_row }
注意事项
- 若需要处理
.xlsx格式文件,将Spreadsheet::ParseExcel替换为Spreadsheet::XLSX即可,二者调用逻辑完全一致 - 工作表名称匹配区分大小写,需确认传入的表名与Excel内实际名称完全一致
内容的提问来源于stack exchange,提问作者user16121622
相关产品推荐
相关产品推荐

