首先感谢阅读本文。我有一个小脚本收集各种txt文件并将它们放入Excel工作表,我之前使用Spreadsheet :: WriteExcel来做这个,所有工作正常。然而,当我开发脚本时,我更应该使用Win :: OLE来执行此功能,因为我更喜欢使用模板Excel文件(使用预先存在的公式),我可以将这些txt文件添加到工作表中。 / p>
我正在努力将Spreadsheet :: WriteExcel更改为Win :: OLE,并使用粘贴功能将文本文件放入电子表格中。这是有效的代码(从添加txt文件@ line>>>> $ 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粘贴到工作表中(使用上面相同的子程序@ line&gt;&gt; &gt;&gt; $ sheet-&gt; Cells(0,0) - &gt; {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“细胞”在线......
非常感谢任何指针/建议。
谢谢, MikG
答案 0 :(得分:1)
看看Range功能。例如
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;
答案 1 :(得分:0)
我没有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 ]];