Perl使用OLE写入Excel工作表

时间:2014-04-24 15:41:25

标签: excel perl

首先感谢阅读本文。我有一个小脚本收集各种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

2 个答案:

答案 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  ]];