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.
精彩评论