【问题标题】:How do I add a multidimensional array (AoA) to Excel using Perl?如何使用 Perl 将多维数组 (AoA) 添加到 Excel?
【发布时间】:2010-10-18 06:52:46
【问题描述】:

我想使用 Perl 在 Excel 中添加存储在 2x2 维数组中的数据。我知道如何打开和添加简单的数据。我可以使用 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 完全正确。请单独提出关于 Paint 的问题。

标签: perl arrays excel multidimensional-array


【解决方案1】:

我看到您使用的是 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 会更好。
  • Spreadsheet::WriteExcel 的优点是它速度快、文档齐全并且可以在 Perl 工作的每个平台上运行。它的功能,我希望是明确的,是创建一个新的 Excel 文件。要修改现有的 Excel 文件,可以使用 Spreadsheet::ParseExcel::Saveparser。
  • 嗯,我以前没见过那个模块;我得去看看。
【解决方案2】:

根据一些阅读(我面前没有 Win32 框),看起来 RangeValue 属性正确处理了对 AoA 的引用,所以试着说:

my $data = [
    ["a1", "b1"],
    ["a2", "b2"],
];
$sheet->Range("A1:B" . @$data)->{Value} = $data;

【讨论】:

  • Range.Value 是一个大小为 Rows * Columns 的数组(C# 表示法中的 object[,])(所谓的 R1C1 表示法)。在您的示例中,2 * 2。 A1:C4 尺寸为 4*3
  • 也就是说,不需要$size。根据 $data 的大小,它必须始终为 2。
  • 我只是不假思索地复制了示例,我已将其更正为使用 AoA 来确定行数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-30
  • 1970-01-01
  • 2012-11-05
  • 2014-08-25
相关资源
最近更新 更多