Как объединить два файла Excel (xls) в Perl или в пакетном режиме? - PullRequest
3 голосов
/ 22 июля 2011

У меня есть два файла, скажем, a.xls и b.xls. Первый содержит 2 листа, а второй 3 из них. Может кто-нибудь сообщить мне, могу ли я объединить их, используя Perl или пакетные скрипты?

Я хочу вывод с 5 листами в одном XLS файле.

Ответы [ 3 ]

6 голосов
/ 22 июля 2011

Для решения Perl используйте Spreadsheet :: ParseExcel для чтения файлов и Spreadsheet :: WriteExcel для сохранения вывода.Оба модуля хорошо документированы и содержат множество примеров кода (например, WriteExcel )

1 голос
/ 22 июля 2011

Если вы работаете в Windows, у вас установлен Excel и вы можете использовать Win32 :: OLE (например, скрипт не будет вызываться веб-сервером и т. Д.), Должно работать следующее:

#!/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 голосов
/ 21 декабря 2014

Вы можете сделать это с помощью Alacon - утилиты командной строки для Alasql базы данных.

Работает с Node.js, поэтому вам нужно установить Node.js а затем Alasql package:

Чтобы извлечь данные из файла 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})"

Это одна очень длинная строка.В этом примере все файлы имеют данные в листах «Лист1».

...