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 the
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.
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;
}