2011-07-22 7 views
3

私は2つのファイルがa.xlsb.xlsと言うことができます。第1のものは2枚のシートを含み、第2のシートは3枚のシートを含む。 Perlやバッチスクリプトを使ってそれらをマージすることができれば誰かに教えてもらえますか?2つのExcel(xls)ファイルをPerlまたはバッチでマージするにはどうすればよいですか?

XLSファイルに5枚の出力が必要です。

+0

シートには何が含まれていますか?どのチャートや数式ですか?どのオペレーティングシステムですか?そして、Excelをインストールしましたか? –

+0

単純なExcelファイル以外のものを扱う場合は、Win32 :: OLEも必要です(ただし、Excel機能を利用するにはExcelをインストールしたWindowsマシン上に置く必要があります)。http://www.perlmonks.org/?node_id= 855945 – mrk

答えて

6

Perlソリューションの場合は、ファイルを読むにはSpreadsheet::ParseExcel、出力を保存するにはSpreadsheet::WriteExcelを使用します。両方のモジュールにはよく文書化されており、多くのサンプルコードが付属しています(例:WriteExcel

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; 
} 
0

あなたはAlaconでそれを行うことができます - Alasqlデータベースのためのコマンドラインユーティリティを。

それはあなたがNode.js、その後Alasqlパッケージをインストールする必要がありますので、Node.jsのと連携して動作します。

次のコマンドを使用することができます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であります長い行。この例では、すべてのファイルに "Sheet1"シートのデータがあります。