Perl如何在Excel文件中操作多个工作表?

时间:2016-08-08 01:15:55

标签: perl

我还在学习Perl,并且正在尝试执行以下任务 - 而且我很沮丧。

目前我有以下内容。

  1. 打开必要的Excel文件
  2. 在var $workbook1
  3. 下存储工作簿信息
  4. 在var $worksheets1
  5. 下存储工作表信息

    my $excel = Win32::OLE -> new("Excel.Application");
    $excel->{Visible} = 0;
    $excel->{DisplayAlerts}=0;
    $excel->{SheetsInNewWorkbook} = 1;
    
    my $workbook1   = $excel->Workbooks->Open($OutFileName);
    
    my $worksheet1  = $workbook1->Worksheets(1);
    

    我稍后获取此信息并让Perl在Excel文件的单元格中写入(相应地初始化了必要的$Row$Col)。

    $worksheet1->Cells($Row, $Col)->{'Value'} = $var1;
    $worksheet1->Cells($Row, $Col+1)->{'Value'} = $var2;
    $worksheet1->Cells($Row, $Col+2)->{'Value'} = $var3;
    $worksheet1->Cells($Row, $Col+3)->{'Value'} = $var4;
    

    到目前为止这个工作正常。 我打算做的是操作多个工作表而不是一个。

    1. 打开必要的Excel文件
    2. 将工作簿信息存储在var $ workbook1
    3. var(s)$ worksheets1,$ worksheets2,$ worksheets3,$ worksheets4,$ worksheets5下存储Wortsheets信息(如果可能的话,将其存储到数组中?)
    4. 我需要在Excel文件中操作总共5个工作表。

      我试图为每个工作表循环后一个进程(我在单元格中写入),但我试图找到一种更简单的方法来回忆$ worksheet1,$ worksheet2,.. 。,$ worksheet5变量。 Cuz,现在没有正确的数组变量 - 我在Perl中学到了如何 - 我需要为每个for循环做一个if语句并编写相应的代码,这是非常无效的..有没有办法使用数组或其他内容为工作表变量执行此操作?

      我更熟悉Matlab的工作方式......如果它是带有数组的Matlab脚本,我希望Perl做什么。

      for i = 1:num_worksheets
      # write in worksheet[i] cell (j,k) with variable var1
      end
      

1 个答案:

答案 0 :(得分:0)

我不完全确定我明白你的意思,但我认为你想做的不是重复代码。至少这就是我理解你的Matlab代码的方式。

您可以将所有工作表放入Perl中的一个数组中。

my $worksheet1 = $workbook1->Worksheets(1);
my $worksheet2 = $workbook1->Worksheets(2);
my $worksheet3 = $workbook1->Worksheets(3);

或更短:

my @worksheets (
    $workbook1->Worksheets(1),
    $workbook1->Worksheets(2),
    $workbook1->Worksheets(3),
);

甚至更短:

my @worksheets = map { $workbook1->Worksheets($_) } 1 .. 3;

然后你可以迭代那个数组。 $worksheet变量都是对象,Perl中的对象是引用。这意味着如果将它们放入数组中,则不会复制对象。

foreach my $sheet ( @worksheets ) {
    $sheet->Cells($row, $col)->{'Value'}     = $var1;
    $sheet->Cells($row, $col + 1)->{'Value'} = $var2;
}

该代码会将$var1$var2写入所有三个工作表1,2和3中的$row / $col单元格。

您甚至不必创建阵列。您可以提供工作簿列表,如果它是您按顺序一起使用所有工作簿的唯一位置。

foreach my $sheet ($worksheet1, $worksheet2, $worksheet3) {
    $sheet->Cells($row, $col)->{'Value'}     = $var1;
}