PerlでExcelファイルをCSV形式に変換

Win32::OLEモジュールを使うと、PerlからWordやExcelなどのファイルにアクセスできるようになる。

ExcelシートからCSV形式への変換は、xlsファイルから読み込んだブックのセルの内容を取得し、カンマで連結したものをシート別にファイルへ書き出す方法と、xlsファイルをシート単位でcsv形式で保存する方法がある。
Excelを開いてcsv形式で保存する作業を自動化するだけなので、後者の方法が効率的だし、短時間で済む。
前者の場合、Excelでのcsv形式に合わせる必要があるため、セル文字列にカンマと二重引用符が含まれる場合、ちょっとした工夫が要る。以下のように、二重引用符を2つずつにし、両端を二重引用符で囲むと、1つのセルの内容と見なされ、中で使われる二重引用符は区切り文字では無く、ただの文字として扱われる。

# セル内容にカンマ、二重引用符が含まれる場合
# $cel_out は、セルの内容
if ($cel_out =~ m/(.*?)(,|")(.*?)/) {
    $cel_out =~ s/"/""/g;
    $cel_out = '"'.$cel_out.'"';
}

後者は、シート別にSaveAsメソッドで保存するだけ。

my $Excel = Win32::OLE->GetActiveObject('Excel.Application')
    || Win32::OLE->new('Excel.Application', 'Quit');  
my $Book = $Excel->Workbooks->Open('xxx.xls'); 
$Excel->{DisplayAlerts} = 'False';
my $SheetCount = $Book->Worksheets->{Count};
foreach my $iSheet (1..$SheetCount) {
    my $Sheet = $Book->Worksheets($iSheet);
    $Sheet->SaveAs('xxx_'.$Sheet->{Name}.'.csv', xlCSV);
}
$Book->Close;
$Excel->Quit();

参考ページ
Excelシート名一覧
perlでMS-Excelファイル(xls)データ読込:IT資格取得の軌跡:So-net blog
PerlでCSV(テキスト)からXLS(エクセル)への最速変換