开发者

How can I merge two Excel (xls) files in Perl or batch?

I have two files lets say a.xls and b.xls. The 开发者_如何学运维first one contains 2 sheets and the second one 3 of them. Can someone let me know if I can merge them using Perl or batch scripting?

I want an output with 5 sheets in one single XLS file.


For a Perl solution use Spreadsheet::ParseExcel to read the files and Spreadsheet::WriteExcel to save your output. Both modules are well documented and come with lots of example code(e.g. WriteExcel)


If you are running on Windows, have Excel installed and can use Win32::OLE (e.g. the script will not be invoked by a web server etc), the following should work:

#!/usr/bin/perl

use warnings;
use strict;

use FindBin qw($Bin);
use File::Spec::Functions qw( catfile );

use Win32::OLE qw(in);
use Win32::OLE::Const 'Microsoft Excel';
$Win32::OLE::Warn = 3;

my $excel = get_excel();
$excel->{Visible} = 1; # for illustration only

my @src = map $excel->Workbooks->Open($_),
          map catfile($Bin, $_),
          qw(one.xls two.xls)
          ;

my $target = $excel->Workbooks->Add(xlWBATWorksheet);
my $before = $target->Worksheets->Item(1);

for my $book ( @src ) {
    my $sheets = $book->Worksheets;
    my $it = Win32::OLE::Enum->new($sheets);

    while (defined(my $sheet = $it->Next)) {
        $sheet->Copy($before);
    }
}

$before->Delete;

$_->Close for @src;
$target->SaveAs(catfile($Bin, 'test.xls'));
$target->Close;

sub get_excel {
    my $excel = Win32::OLE->GetActiveObject('Excel.Application');
    unless(defined $excel) {
        $excel = Win32::OLE->new('Excel.Application', sub { $_[0]->Quit })
            or die "Oops, cannot start Excel: ",
                   Win32::OLE->LastError, "\n";
    }
    return $excel;
}


You can do it with Alacon - command-line utility for Alasql database.

It works with Node.js, so you need to install Node.js and then Alasql package:

To take data from Excel file you can use the following command:

> node alacon "SELECT * INTO XLSX("main.xls",{headers:true}) 
               FROM XLSX('data1.xlsx', {headers:true}) 
               UNION ALL SELECT * FROM XLSX('data2.xlsx', {headers:true})
               UNION ALL SELECT * FROM XLSX('data3.xlsx', {headers:true})
               UNION ALL SELECT * FROM XLSX('data4.xlsx', {headers:true})
               UNION ALL SELECT * FROM XLSX('data5.xlsx', {headers:true})"

This is one very long line. In this example all files have data in "Sheet1" sheets.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜