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

后端 未结 3 2074
后悔当初
后悔当初 2021-01-14 18:13

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

相关标签:
3条回答
  • 2021-01-14 18:45

    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 讨论(0)
  • 2021-01-14 18:48

    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)

    0 讨论(0)
  • 2021-01-14 18:55

    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;
    }
    
    0 讨论(0)
提交回复
热议问题