使用Spreadsheet :: WriteExcel

时间:2013-04-05 13:18:01

标签: perl parsing

我想从一个Excel工作表中提取一些信息,然后将其重新格式化为另一个。数据结构类似于:

      col1      col2
row1  School    1
row2  Dean      John
row3  No.stu.   55
row4  some irrelevant stuff
row5  School2   2
row6  Dean      Tony
row7  No. stu.  60
row8  some irrelevant stuff
row9  School    3
row10 Dean      James
row11 No.stu.   56
row12 No. teacher 20

我想要实现的输出是:

      col1 col2 col3
row1 School Dean No.stu.  No. teacher
row2 1      John  55
row3 2      Tony  60
row4 3      James 56       20

我建议用来从Excel中提取信息的代码如下(感谢来自 PerlMonks 的hdb)。

use strict; use warnings;

use Spreadsheet::ParseExcel;

my ($infile) = @ARGV;

my $parser   = Spreadsheet::ParseExcel->new();
my $workbook = $parser->parse($infile);
die $parser->error unless defined $workbook;
my ($worksheet) = $workbook->worksheets();

my %data; # Accumulate data here
my $row = 0;
my $school = 0;
while (1) {
    my $cell = $worksheet->get_cell($row, 0);
    last unless defined($cell);
    my $key =  $cell->value();
    my $data = $worksheet->get_cell($row++, 1)->value();
    if( $key eq "School" ) {
        $school = $data;
    }
    else {
        $data{$school}{$key} = $data;
    }
}

现在,下一步是将所有内容重新编写到新的Excel工作表中。我怎么能这样做?

1 个答案:

答案 0 :(得分:0)

您的代码有点破碎。这是我的:

use strict;
use warnings;

use Spreadsheet::ParseExcel;
use FindBin qw($Bin);

my ($infile) = @ARGV;

my $parser   = Spreadsheet::ParseExcel->new();
my $workbook = $parser->parse("$Bin/Test.xls");
die $parser->error unless defined $workbook;
my ($worksheet) = $workbook->worksheets();

my %data;
my $row    = 0;
my $school = "";
while (1) {
    my $cell = $worksheet->get_cell( $row, 0 );
    last unless defined($cell);

    my $key = $cell->value();
    my $value = $worksheet->get_cell( $row++, 1 )->value();

    if ( $key eq "School" ) {

        $school = $value;
        next;
    }

    $data{$school}->{$key} = $value;
}
sleep 1;

use Spreadsheet::WriteExcel;

$workbook = Spreadsheet::WriteExcel->new('Result.xls');

$worksheet = $workbook->add_worksheet();
my $col = 0;
$row = 0;

$worksheet->write( $row++, $col,
    [ "School", "Dean", "No.stu.", "No. teacher" ] );

foreach my $school ( sort keys %data ) {

    $worksheet->write( $row++, $col,
        [ $school, @{ $data{$school} }{ "Dean", "No.stu.", "No. teacher" } ] );
}
$workbook->close();