2009-09-02 39 views
7

Spreadsheet::WriteExcelで新しいブックを作成できますが、既存のブックを開いて特定の列を変更したい場合はどうすればよいですか?どうすればそれを達成できますか?Perlで既存のExcelブックを変更するにはどうすればよいですか?

Spreadsheet::ParseExcelを使用してシートからすべてのデータを解析し、Spreadsheet::WriteExcelを使用して特定の行/列に新しい値を書き戻すことができました。既に2つを組み合わせたモジュールはありますか?

主に私は.xlsを開き、特定の行/列を上書きして保存したいだけです。

my $parser = Spreadsheet::ParseExcel->new(); 
# $workbook is a Spreadsheet::ParseExcel::Workbook object 
my $workbook = $parser->Parse('Book1.xls'); 

をしかし、あなた本当にが欲しいのSpreadsheet::ParseExcelSpreadsheet::WriteExcelの組み合わせである、Spreadsheet::ParseExcel::SaveParserです:

答えて

13

Spreadsheet::ParseExcelは、既存のExcelファイルを読み込みます。ドキュメントの末尾にはexampleがあります。

+0

ParseExcelを使用してExcelブックに書き込む方法がありません – user105033

+0

Spreadsheet :: ParseExcel :: SaveParserがそれを行います。あなたは私の編集を破った。 :) – Ether

3

Modifying and Rewriting SpreadsheetsをカバーするSpreadsheet :: WriteExcelドキュメントのセクションがあります。

Excelファイルは、バイナリファイル内のバイナリファイルです。これにはいくつかの相互リンクされたチェックサムが含まれています.1バイトでも変更すると破損する可能性があります。

このように、単にExcelファイルを追加または更新することはできません。これを達成する唯一の方法は、ファイル全体をメモリに読み込み、必要な変更または追加を行い、ファイルを再度書き出すことです。

Excelファイルは、Spreadsheet :: ParseExcel :: Spreadsheet :: WriteExcelのラッパーであるSpreadsheet :: ParseExcel :: SaveParserモジュールを使用して読み書きできます。これはSpreadsheet::ParseExcelパッケージの一部です。

例もあります。

1

Spreadsheet::ParseExcel::SaveParserモジュールは、Spreadsheet :: ParseExcelとSpreadsheet :: WriteExcelのラッパーです。

私は最近、is a clearer example of how to do thisのドキュメントを更新しました。

+0

私はまだこの例を得ていません。私はSaveAsが受け入れるもののドキュメントを見つけることができません。ファイルハンドルの代わりにスカラーリファレンスを渡すことは可能ですか? – Myforwik

+0

私は、John McNamaraがwrite_to_scalar.plファイルをパッケージに含めていることに気付きました。それを使用して、私はXLSファイルのメモリ変更をメモリに行うことができました:-D – Myforwik

9

Excelをインストールしている場合は、Win32::OLEでこれを行うのはほとんどありません。ここでWin32::OLE自身のドキュメントからの例です:

use Win32::OLE; 

# use existing instance if Excel is already running 
eval {$ex = Win32::OLE->GetActiveObject('Excel.Application')}; 
die "Excel not installed" if [email protected]; 
unless (defined $ex) { 
    $ex = Win32::OLE->new('Excel.Application', sub {$_[0]->Quit;}) 
      or die "Oops, cannot start Excel"; 
} 

# get a new workbook 
$book = $ex->Workbooks->Add; 

# write to a particular cell 
$sheet = $book->Worksheets(1); 
$sheet->Cells(1,1)->{Value} = "foo"; 

# write a 2 rows by 3 columns range 
$sheet->Range("A8:C9")->{Value} = [[ undef, 'Xyzzy', 'Plugh' ], 
            [ 42, 'Perl', 3.1415 ]]; 

# print "XyzzyPerl" 
$array = $sheet->Range("A8:C9")->{Value}; 
for (@$array) { 
    for (@$_) { 
     print defined($_) ? "$_|" : "<undef>|"; 
    } 
    print "\n"; 
} 

# save and exit 
$book->SaveAs('test.xls'); 
undef $book; 
undef $ex; 

基本的には、Win32::OLEはあなたのものの巨大な様々なを含んでVBAまたはVisual Basicアプリケーションに利用できるすべてを提供します - ExcelとWordの自動化に至るまでWindows Script Hostを介してネットワークドライブを列挙してマウントする方法まで。それはActivePerlの最後の数版で標準になっています。

+1

さらに、列全体を一度に\ rowsに書き込むことができ、書き込み速度に影響します。これで十分でない場合は、マクロが含まれているExcelに書き込んで、そのモジュールで実行することもできます。 –

+0

ありがとうございます。私はSpreadsheet :: ParseXLSX :: SaveParserが存在しないことに気付きました。 –

+0

@ usr-bin-drinking:うれしいです:) –