PerlでEXCELブックからセルデータを読み込む
前回、PerlのロジックからEXCELブックへセルデータを書き込みましたが、今回は逆に読み込みます。
以下のサンプルは、EXCELブックファイルを読み込み、セルデータを取得します。
ポイントは、EXCELシート上のセルデータを求めるためのEndメソッド(実行数と実列数の取得)の使用です。
あとは、Cells方式からRange方式に変換と取得データが配列の配列になっていることです。
#!/usr/local/bin/perl -w use strict; my $ExcelFile = 'D:\test_book.xls'; # 読み込みEXCELブックファイル my $scalar; my $ref_array; my $data = &putExcel2Data($ExcelFile); # データ表示 foreach $ref_array (@$data) { # $ref_arrayには各行データの配列のリファレンスが格納される print "\n-----------------------------------------------\n"; foreach $scalar (@$ref_array) { # @$ref_arrayは行データの配列で、$scalarにはセルデータが格納される print $scalar, " "; } } sub putExcel2Data{ my ($FilePath) = @_; use Win32::OLE; # 指定タイプライブラリのコンスタントが参照可能 use Win32::OLE::Const 'Microsoft Excel'; # エラー時に本処理を中止し、Perlがエラーメッセージを出力し、本プロセスが終了する Win32::OLE->Option(Warn => 3); # EXCEL使用可能かチェック eval { Win32::OLE->GetActiveObject('Excel.Application'); }; if ($@) { die "Excelが入っていません。$@"; } # EXCELオブジェクト取得 my $Excel = Win32::OLE->GetActiveObject('Excel.Application') || Win32::OLE->new('Excel.Application', 'Quit'); my $Book = $Excel->Workbooks->Open($FilePath); my $Sheet = $Book->Worksheets(1); # 実行数を取得 my $RowsCount = $Sheet->Range("A65536")->End(xlUp)->{'Row'}; # 実列数を取得 my $ColumnCount = $Sheet->Cells(1, 256)->End(xlToLeft)->{'Column'}; # Cells方式からRange方式に変換 my $Range = $Sheet->Cells($RowsCount, $ColumnCount)->Address("RowAbsolute:=False, ColumnAbsolute:=False"); $Range =~ s/\$//g; # 全データ取得($arrayには、行毎のデータが格納された配列のリファレンスのすべてを格納した配列のリファレンスが格納される【分かります?】) my $array = $Sheet->Range("A1:$Range")->{'Value'}; $Book->Close; $Excel->Quit(); return $array; }