最新 RSS

horiday blog

2008/02/08

[perl] perl でエクセルファイルからテキストを抽出する

職場でなぜか膨大なエクセルファイルを Web ページにしたいと言われました.

perl では Spreadsheet::ParseExcel というモジュールを使うとできるらしい.

さっそくこのモジュールをインストールして,サンプルコードを実行すると

Weak references are not implemented in the version of perl at /usr/....

というエラーで実行できない.エラーをそのまま検索してみると,Scalar::Util を再インストールするとなおるとのこと.そこで,

cpan> install Scalar::Util

すると今度は,

Cannot forceunlink /usr/lib/perl5/5.8/cygwin/auto/List/Util/Util.dll Permission denied

実行中のファイルだから上書きできないということらしい(cygwin だからなのですが).

上記の Util.dll を消すと cpan 自体が使えなくなるので,どうしようかと cpan 上で再構築することで対処できた.

% cpan
cpan> look Scalar::Util
Scar::Util のビルドに入る
% perl Makefile.PL
% make uninstall
% perl Makefile.PL -xs
% make
% make install
% exit

cygwin は変なところでつまづくので,面倒ですね.サクサク動く coLinux の方が良いのでしょうか.

最終的にエクセルファイルからテキストを抽出するコードは下記のものを参考にさせてもらいました.日本語もオケらしい...

use strict;
use Spreadsheet::ParseExcel;
use Spreadsheet::ParseExcel::FmtJapan;
my $oExcel = new Spreadsheet::ParseExcel;
#sjis、jisなどのコード
my $oFmtJ = Spreadsheet::ParseExcel::FmtJapan->new(Code => 'euc');
my $oBook = $oExcel->Parse('Excel/Test97.xls', $oFmtJ);
#情報の取り出し例
my($iR, $iC, $oWkS, $oWkC);
   
print "FILE  :", $oBook->{File} , "\n";
print "COUNT :", $oBook->{SheetCount} , "\n";
print "AUTHOR:", $oBook->{Author} , "\n";
for(my $iSheet=0; $iSheet < $oBook->{SheetCount} ; $iSheet++) {
  $oWkS = $oBook->{Worksheet}[$iSheet];
  print "--------- SHEET:", $oWkS->{Name}, "\n";
  for(my $iR = $oWkS->{MinRow} ; 
          defined $oWkS->{MaxRow} && $iR <= $oWkS->{MaxRow} ; $iR++) {
      for(my $iC = $oWkS->{MinCol} ;
             defined $oWkS->{MaxCol} && $iC <= $oWkS->{MaxCol} ; $iC++) {
          $oWkC = $oWkS->{Cells}[$iR][$iC];
          print "( $iR , $iC ) =>", $oWkC->Value, "\n" if($oWkC);
      }
  }
}