如何使用Perl将多维数组(AoA)添加到Excel?

3

我希望使用Perl将存储在2x2维数组中的数据添加到Excel中。我知道如何打开和添加简单的数据,可以使用for循环来实现。但是如何更加优雅地完成呢?

这就是我想要做的事情。

$sheet->Range("A1:B"."$size")->{Value} = @$data;
                                         or   @data;
                                         or   {@data};
                                         or   {\@data};

其中@data是一个二维数组。

# use existing instance if Excel is already running
eval {$ex = Win32::OLE->GetActiveObject('Excel.Application')};
die "Excel not installed" if $@;
unless (defined $ex) {
    $ex = Win32::OLE->new('Excel.Application', sub {$_[0]->Quit;})
            or die "Oops, cannot start Excel";
}


# get a new workbook
$book = $ex->Workbooks->Add;

# write to a particular cell
$sheet = $book->Worksheets(1);
print "A1:B"."$size";
# write a 2 rows by 3 columns range

$sheet->Range("A1:B"."$size")->{Value} = @$data;

请不要混杂(大多数)无关的问题。 - Alnitak
Alnitak 是完全正确的。请将关于 Paint 的问题单独提出。 - innaM
2个回答

3

我看到你正在使用Win32::OLE,但使用Spreadsheet::WriteExcel也很容易实现这种功能:

#!/usr/bin/perl -w

use strict;
use Spreadsheet::WriteExcel;

my $workbook  = Spreadsheet::WriteExcel->new('test.xls');
my $worksheet = $workbook->add_worksheet();

# Get your AoA from somewhere.
my $data = [
    [ 'Hello', 'world', 123   ],
    [ 'Bye',   'bye',   4.567 ],
];

# Write the data.
$worksheet->write_col( 'A1', $data );

Spreadsheet::WriteExcel 的缺点是无法修改现有的电子表格。这意味着您必须使用 Spreadsheet::ParseExcel 将现有电子表格中的数据复制到要修改的电子表格中,然后再进行修改。代码会变得很丑陋,因此如果您在 Win32 上,则可以使用 Win32::OLE 更好。 - Chas. Owens
Spreadsheet::WriteExcel的好处是它快速、文档齐全,并且可以在Perl支持的每个平台上运行。它的功能很明显,就是创建一个新的Excel文件。要修改现有的Excel文件,可以使用Spreadsheet::ParseExcel::Saveparser。 - jmcnamara
嗯,我以前没见过这个模块;我得去查一下。 - Chas. Owens

2
根据一些阅读(我面前没有Win32盒子),看起来RangeValue属性正确处理对AoA的引用,因此尝试说:
my $data = [
    ["a1", "b1"],
    ["a2", "b2"],
];
$sheet->Range("A1:B" . @$data)->{Value} = $data;

Range.Value 是一个数组的数组(在 C# 中表示为 object[,]),大小为行数 * 列数(所谓的 R1C1 表示法)。在您的示例中,大小为 22。对于 A1:C4,大小将是 43。 - abatishchev
换句话说,$size是不必要的。根据$data的大小,它始终必须为2。 - abatishchev
我只是盲目地复制了这个例子,现在我已经改正了它,使用AoA来确定行数。 - Chas. Owens

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接