📜  珀尔 |读取 Excel 文件

📅  最后修改于: 2022-05-13 01:55:49.929000             🧑  作者: Mango

珀尔 |读取 Excel 文件

Excel 工作表是维护办公记录的最常用方法之一,尤其适用于非开发人员甚至管理人员可以批量向系统提供输入的应用程序。

但是,问题是从 Microsoft Excel 使用 Perl 创建的文件中读取内容。

CPAN 提供了几个用于读取 Excel 文件的模块。有Spreadsheet::Read将能够处理所有类型的电子表格。还有其他低级库通过不同版本的 Excel 读取文件:

  • 电子表格::ParseExcel Excel 95-2003 文件,
  • 电子表格::ParseXLSX Excel 2007 Open XML XLSX

创建 Excel 文件

Excel 文件可以使用 Perl 借助内置模块Excel::Writer::XLSX创建,该模块用于创建 Excel 文件。
此外, write()函数用于向 excel 文件添加内容。
例子:

#!/usr/bin/perl
use Excel::Writer::XLSX;
my $Excel_book1  = Excel::Writer::XLSX->new('new_excel.xlsx' );
my $Excel_sheet1 = $Excel_book1->add_worksheet();
my @data_row = (1, 2, 3, 4);
my @table_data = (
    ["l", "m"],
    ["n", "o"],
    ["p", "q"],
);
my @data_column = (1, 2, 3, 4, 5, 6, 7);
  
# Using write() to write values in sheet
$Excel_sheet1->write( "A1", "Geeks For Geeks" );
$Excel_sheet1->write( "A2", "Perl|Reading Files in Excel" );
$Excel_sheet1->write( "A3", \@data_row );
$Excel_sheet1->write( 4, 0, \@table_data );
$Excel_sheet1->write( 0, 4, [ \@data_column ] );
$Excel_book1->close;


从 Excel 文件中读取

在 Perl 中读取 Excel 文件是通过使用 Perl 脚本中的Spreadsheet::Read模块来完成的。该模块导出了一些您可以在 Perl 代码脚本中导入或使用的函数。 ReadData()函数用于从 excel 文件中读取数据。
ReadData()函数接受一个文件名,在这种情况下是一个 Excel 文件,但它也接受各种其他文件类型。基于文件扩展名,它将加载适当的后端模块,然后解析文件。它创建一个代表整个文件的数组引用:
例子:

use 5.016;
use Spreadsheet::Read qw(ReadData);
my $book_data = ReadData (‘new_excel.xlsx');
say 'A2: ' . $book_data->[1]{A2};

在上面的代码中,返回的数组的第一个元素包含有关文件的一般信息。其余元素代表文件中的其他工作表。换句话说, $book_data->[1] 代表“ new_excel.xlsx ”的第一张纸。这可用于访问单元格的内容,因为它是一个哈希引用。 $book_data->[1]{A2} 返回 A2 元素的哈希引用

输出:

A2: Perl|Reading Files in Excel

获取 Excel 文件的行

Spreadsheet::Read函数的参数是一张表,以及要获取的行数。返回类型是一个数组,其中包含在参数中传递的行的值。
下面的程序演示了如何读取第一张工作表的第一行,然后在该行的每个字段中显示内容。

my @rowsingle = Spreadsheet::Read::row($book_data->[1], 1);
for my $i (0 .. $#rowsingle)
{
    say 'A' . ($i + 1) . ' ' . 
              ($rowsingle[$i] // '');
}

输出:

获取文件内容

获取单行是远远不够的。我们需要获取所有行以进行高效编程。我们使用rows()函数来完成此操作。此函数将工作表作为参数。它以矩阵(二维数组)的形式返回元素数组或引用数组。矩阵中的每个元素代表电子表格中的一行。
获取所有行的脚本如下:

my @rowsmulti = Spreadsheet::Read::rows($book_data->[1]);
foreach my $m (1 .. scalar @rowsmulti) 
{
    foreach my $n (1 .. scalar @{$rowsmulti[$m - 1]}) 
    {
        say chr(64 + $m) . " $m " .
               ($rowsmulti[$m - 1][$n - 1] // '');
    }
}

输出:

把它们放在一起
以下 Perl 脚本说明了上述所有在 Perl 中读取 Excel 文件的功能的使用:

#!/usr/bin/perl
use strict;
use warnings;
use 5.010;
  
use Spreadsheet::Read qw(ReadData);
  
my $bookdata = ReadData('simplecreate.xlsx');
  
say 'A1: ' . $bookdata->[1]{A1}; 
  
# Fetching a single row
my @rowsingle = Spreadsheet::Read::row($bookdata->[1], 1);
for my $i (0 .. $#row) 
{
    say 'A' . ($i + 1) . ' ' . 
              ($rowsingle[$i] // '');
}
  
# Fetching all file content
my @rowsmulti = Spreadsheet::Read::rows($bookdata->[1]);
foreach my $i (1 .. scalar @rowsmulti) 
{
    foreach my $j (1 .. scalar @{$rows[$i-1]}) 
    {
        say chr(64 + $i) . " $j " . 
               ($rows[$i - 1][$j - 1] // '');
    }
}

输出: