如何删除Excel工作表中的整列并使用Perl在新的Excel文件中写入更新的数据?

Joe*_*hie 6 perl

我是Perl的新手.我有excel文件说"sample.xls",如下所示. Sample.xls

有大约这样的1000行数据.我想解析这个文件并将其写在另一个文件中,如下所示输出格式为"output.xls".

output.xls 我在perl中编写了一个脚本,然而,它并没有按照我想要的方式给出确切的输出.此外,看起来脚本效率不高.任何人都可以指导我如何改进我的脚本以及输出如"output.xls"所示?

这是脚本:

#!/usr/bin/perl –w

use strict;
use warnings;
use Spreadsheet::ParseExcel;
use Spreadsheet::WriteExcel;
use Spreadsheet::WriteExcel::Chart;


# Read the input and output filenames.
my $inputfile  = "path/sample.xls";
my $outputfile = "path/output.xls";

if ( !$inputfile || !$outputfile ) {
    die( "Couldn't find file\n" );
}

my $parser      = Spreadsheet::ParseExcel->new();
my $inwb = $parser->parse( $inputfile );

if ( !defined $inwb ) {
    die "Parsing error: ", $parser->error(), ".\n";
}

my $outwb = Spreadsheet::WriteExcel->new( $outputfile );


my $inws  = $inwb->worksheet( "Sheet1" );
my $outws = $outwb->add_worksheet("Sheet1");
my $out_row       = 0;

my ( $row_min, $row_max ) = $inws->row_range();
my ( $col_min, $col_max ) = $inws->col_range();

my $format = $outwb->add_format(
center_across => 1,
bold => 1,
size => 10,
border => 4,
color => 'black',
border_color => 'black',
align => 'vcenter',
);


$outws->write(0,0, "Item Name", $format);
$outws->write(0,1, "Spec", $format);
$outws->write(0,2, "First name", $format);
$outws->write(0,3, "Middle Name", $format);
$outws->write(0,4, "Last Name", $format);
$outws->write(0,5, "Customer Number", $format);
$outws->write(0,6, "Age", $format);
$outws->write(0,7, "Units", $format);

my $col_count = 1;
#$row_min = 1;
for my $inws ( $inwb->worksheets() ) {
    my ( $row_min, $row_max ) = $inws->row_range();
    my ( $col_min, $col_max ) = $inws->col_range();

    for my $in_row ( 2 .. $row_max ) {

        for my $col (  0 .. 0 ) {


            my $cell = $inws->get_cell( $in_row, $col);

            my @fields = split /_/, $cell->value();
                next unless $cell;


            $outws->write($in_row,$col, $cell->value());
            $outws->write($in_row,$col+1, $fields[1]);
        }
    }   

    for my $in_row ( 2 .. $row_max ) {

        for my $col (  1 .. 1 ) {

            my $cell = $inws->get_cell( $in_row, $col);

            my @fields = split /_/, $cell->value();
                next unless $cell;


            #$outws->write($in_row,$col+1, $cell->value());
            $outws->write($in_row,$col+1, $fields[0]);
            $outws->write($in_row,$col+2, $fields[1]);
            $outws->write($in_row,$col+3, $fields[2]);
            $outws->write($in_row,$col+4, $fields[3]);
        }
    }   

    for my $in_row ( 2 .. $row_max ) {

        for my $col (  2 .. 2 ) {

            my $cell = $inws->get_cell( $in_row, $col);

            my @fields = split /_/, $cell->value();
                next unless $cell;


            $outws->write($in_row,6, $cell->value());
        }
    }   

    for my $in_row ( 2 .. $row_max ) {

        for my $col (  3 .. 9 ) {

            my $cell = $inws->get_cell( $in_row, $col);

            next unless $cell;


        }
    }   

    for my $in_row ( 2 .. $row_max ) {
        for my $col ( 10 .. 10 ) {

            my $cell = $inws->get_cell( $in_row, $col );

            next unless $cell;


            $outws->write($in_row,7, $cell->value());

        }
    }

}
Run Code Online (Sandbox Code Playgroud)

sim*_*que 4

为了对输出进行排序,您需要在写出之前先收集所有信息。现在,您正在行和列之间来回跳跃。

以下是我要进行的一些更改,以对其进行排序,并使其更有效(阅读)。

  • 在循环外部创建一个数据结构$data来存储所有信息。
  • 如果只有一张工作表,则无需循环工作表。只需使用一张纸即可。
  • 遍历线条。
  • 在该循环内,使用必须解析各个字段的代码来解析它们。没有2..2循环。只是一堆声明。

    my @item_fields = split /_/, $inws->get_cell( $in_row, 0 ) || q{};
    my @name_fields = split /_/, $inws->get_cell( $in_row, $col ) || q{};
    
    Run Code Online (Sandbox Code Playgroud)
  • 将它们存储在$data每个项目中。

    push @{ $data } = [ $item_fields[0], ... ];
    
    Run Code Online (Sandbox Code Playgroud)
  • 循环完成。打开输出文件。

  • $data使用 a循环sort并写入输出文件。

    foreach my $row (sort { $a->[0] cmp $b->[0] } @{ $data } ) { ... }
    
    Run Code Online (Sandbox Code Playgroud)
  • 完毕。

我建议您继续阅读sort并查看perlrefperlreftut以了解有关引用(数据结构)的更多信息。