A DAY IN THE LIFE

すてきなクリエーターにおれはなる!クリエーターってなんぞや!?Tipsまとめ。

PerlからExcelを操作する方法

PerlからExcelを操作するためには

  • Win32::OLE
  • SpreadSheet
    • SpreadSheet::ParseExcel
    • SpreadSheet::WriteExcel
    • SpreadSheet::XLSX
  • Excel
    • Excel::Writer::XLSX

といったモジュールがあるみたいですが
ここでは、SpreadSheetを使ってやっていきます。

環境:Mac OS X Mountain Lion

インストール ヾ(oゝω・o)ノ))

 % sudo perl -MCPAN -e shell
 cpan> install Jcode
 cpan> install Unicode::Map
 cpan> install Spreadsheet::WriteExcel
 cpan> install Spreadsheet::ParseExcel

操作してみる ヾ(oゝω・o)ノ))

以下のコードを使って簡単に操作してみます。

# test1.pl
#!/usr/bin/perl

use strict;
use warnings;
use Spreadsheet::WriteExcel;

# 新しいエクセルワークブックの作成
my $workbook = Spreadsheet::WriteExcel->new( "perlExcel.xls" );

exit;

ソースファイルが置かれたディレクトリに「PerlExcel.xls」が作成されました。

データ(日本語を含む)を読み込んでみる ヾ(oゝω・o)ノ))

 PerlExcel.xls
 f:id:devilily:20131122131933p:plain
このようなデータを読み込んでみたいと思います。

ここで、、

日本語を扱う場合はもう少し作業が必要になります。
 1. http://search.cpan.org/からSpreadsheet::ParseExcelをダウンロードし、解凍
 2. 「CP932Excel.map」をUnicode::Mapがインストールされたディレクトリの/MS/WIN/にコピー
 3. Unicode::Mapの「REGISTRY」に赤文字部分を以下のように追加

・・・
name: CP932
srcURL: $SrcUnicode/VENDORS/MICSFT/WINDOWS/CP932.TXT
src: $DestUnicode/VENDORS/MICSFT/WINDOWS/CP932.TXT
map: $DestMap/MS/WIN/CP932.map

name: CP932Excel
srcURL: $SrcUnicode/VENDORS/MICSFT/WINDOWS/CP932.TXT
src: $DestUnicode/VENDORS/MICSFT/WINDOWS/CP932.TXT
map: $DestMap/MS/WIN/CP932Excel.map

name: CP936
・・・

 4. Spreadsheet::ParseExcelの「FmtJapan.pm」を以下のように変更

変更前:return bless $self, $class;
変更後:return bless $self, "$class";


では、以下のソースコードを使ってデータを読み込んでみる♩

# test2.pl
#!/usr/bin/perl
use strict;
use warnings;
use Spreadsheet::ParseExcel;
 
my $input_file = $ARGV[0];
my $parser   = Spreadsheet::ParseExcel->new();
my $format = Spreadsheet::ParseExcel::FmtJapan2->new(Code => 'utf8');
my $workbook = $parser->parse( $input_file, $format );
 
# ワークシートの読み込み
for my $worksheet ( $workbook->worksheets() ) {
        my ( $row_min, $row_max ) = $worksheet->row_range();
        my ( $col_min, $col_max ) = $worksheet->col_range();
 
        for my $row ( $row_min .. $row_max ) {
                for my $col ( $col_min .. $col_max ) {
                        my $cell = $worksheet->get_cell( $row, $col );
                        my $cell_in = $cell->value();
                        print "[$row][$col] : $cell_in", "\n";

                        next unless $cell;
                }
        }
}

% perl test2.pl perlExcel.xls

[0][0] : A
[0][1] : B
[0][2] : C
[1][0] : あ
[1][1] : い
[1][2] : う

表示されました。めでたしめでたし

ちなみに、ここではxls(Excel97-2003)しかサポートされていないので
xlsxを使うためにはSpreadsheet::XLSXが必要になるみたい (╭☞•́⍛•̀)╭☞