Perl使用OLE写入Excel工作表

首先感谢您阅读这个。 我有一个小脚本,收集各种txt文件,并将其放入Excel工作表,我以前使用Spreadsheet :: WriteExcel来做到这一点,并一切工作正常。 然而,当我开发的脚本,它变得更加明显,我应该使用Win :: OLE来执行此function,因为我宁愿使用模板Excel文件(与现有的公式),我可以将这些txt文件添加为工作表。

我正在努力从Spreadsheet :: WriteExcel更改为Win :: OLE与粘贴function将文本文件放入电子表格。 这里的代码确实工作(从添加txt文件@行>>>> $ wrksheet-> write_col)

...... my $workbook = Spreadsheet::WriteExcel->new("resultsbook.xls"); (my $sheetname = $file) =~s/\.\w+//; my $wrksheet = $workbook->add_worksheet($sheetname); $wrksheet->write_col( 0, 0, readfile($file)); # <-- Old write line } } sub readfile { my @textfilecontent = (); open my $fh, '<', shift() or die "can't open file:$!"; while (<$fh>) { chomp; push @textfilecontent, [split(/\t/)]; } return \@textfilecontent; } 

但是,我已经改变了使用OLE,我得到尽可能命名的Excel工作表选项卡,但我正在努力锻炼如何将提取的txt粘贴到工作表在这里(使用上面相同的子例程@行>>>> $ sheet- > Cells(0,0) – > {Value} = readfile($ file);)…

  my $sheet = $book->Worksheets->Add({After => $book->Worksheets(1)}) $sheet->{Name} = $sheetname; $sheet->Cells(0,0)->{Value} = readfile($file); # <-- New write line ###$sheet->write_col( 0, 0, readfile($file));#### Old method } } sub readfile { my @textfilecontent = (); open my $fh, '<', shift() or die "can't open file:$!"; while (<$fh>) { chomp; push @textfilecontent, [split(/\t/)]; } return \@textfilecontent; } 

我得到以下错误我运行这个脚本…

Win32 :: OLE(0.1711)错误0x800a03ec在METHOD / PROPERTYGET“单元格”行…

任何指针/build议将不胜感激。

谢谢,MikG

看看范围function。 例如

 my $data = readfile($file); # figure out size of data and adjust "A1:Z20" below accordingly $sheet->Range("A1:Z20")->{Value} = $data; 

编辑:

我没有使用Win32 :: OLE,所以这将是我的黑客:使用此版本的readfile函数传回行数和列数:

 sub readfile { my @textfilecontent = (); open my $fh, '<', shift() or die "can't open file:$!"; my ($rows, $cols) = (0,0); while (<$fh>) { chomp; my @row = split(/\t/); $cols = scalar(@row) if scalar(@row) > $cols; push @textfilecontent, \@row; $rows++; } return (\@textfilecontent, $rows, $cols); } 

您可能需要修改此选项以填充(“”)与具有最大列数的列不同的列数的行。 Spreadsheet :: WriteExcel :: Utility中有一个函数可以将行/列转换为A1表示法。 把它包含在你的脚本中,如下所示:

 use Spreadsheet::WriteExcel::Utility qw(xl_rowcol_to_cell); 

那么你的主要例程将如下所示:

 my ($data, $rows, $cols) = readfile($file); my $endCell = xl_rowcol_to_cell($rows, $cols); $sheet->Range("A1:$endCell")->{Value} = $data; 

我没有Excel和使用LibreOffice ,所以我一直使用Spreadsheet::WriteExcel而不是Win32::OLE

但是,您正试图将一个二维数组分配给单个单元格。 Win32::OLE #Examples显示了一个不同的方法来做到这一点:

 # write a 2 rows by 3 columns range $sheet->Range("A8:C9")->{Value} = [[ undef, 'Xyzzy', 'Plugh' ], [ 42, 'Perl', 3.1415 ]];