如何在Perl或批处理中合并两个Excel(xls)文件?

时间:2011-07-22 11:38:36

标签: perl excel batch-file xls

我有两个文件可以说a.xlsb.xls。第一个包含2张,第二个包含3张。如果我可以使用Perl或批处理脚本合并它们,有人可以告诉我吗?

我想在一个XLS文件中输出5张图片。

3 个答案:

答案 0 :(得分:6)

对于Perl解决方案,使用Spreadsheet::ParseExcel来读取文件,使用Spreadsheet::WriteExcel来保存输出。这两个模块都有详细记录,并附带了大量示例代码(例如WriteExcel

答案 1 :(得分:1)

如果您在Windows上运行,安装了Excel并可以使用Win32::OLE(例如,Web服务器不会调用该脚本等),则以下内容应该有效:

#!/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;
}

答案 2 :(得分:0)

您可以使用Alacon - Alasql数据库的命令行实用程序。

它适用于Node.js,因此您需要安装Node.js然后Alasql包:

要从Excel文件中获取数据,您可以使用以下命令:

> 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})"

这是一条很长的路线。在此示例中,所有文件都包含“Sheet1”表中的数据。