小池啓仁 ヒロヒト応援ブログ By はてな

小池啓仁(コイケヒロヒト)の動画など。

小池啓仁 ヒロヒト応援ブログ By はてな

EXCEL2007でIIS/COM経由でのファイルアクセスでメモリ・ディスク容量不足エラー

以前ご紹介した以下のプログラムで、EXCEL2003なら問題ないのですが、EXCEL2007だとエラーになります。


普通にコマンドプロンプトから実行するとEXCEL2007でもエラーになりません。
しかし、IIS/COM経由(WebページからCGI)で実行した時に、『$Excel->Workbooks->OpenText』のところで、以下のエラーとなるのです。


『メモリまたはディスクの空き容量が不足しているため、ドキュメントを開いたり、保存したりできません。 error 0x800a03ec』

PerlCSV(テキスト)からXLS(エクセル)への最速変換

#!/usr/local/bin/perl -w
use strict;
    my $csvFile = 'C:\test_book.csv'; # CSVファイル
    my $xlsFile = 'C:\test_book.xls'; # EXCELブックファイル

    &csv2xls($csvFile, $xlsFile);

sub csv2xls {
    my ($csvFile, $xlsFile) = @_;

    use Win32::OLE;
    # 指定タイプライブラリのコンスタントが参照可能
    use Win32::OLE::Const 'Microsoft Excel';
    # エラー時に本処理を中止し、Perlがエラーメッセージを出力し、本プロセスが終了する
    Win32::OLE->Option(Warn => 3);
    
    my $Excel;

    # EXCEL使用可能かチェック
    eval {
            Win32::OLE->GetActiveObject('Excel.Application');
    };
    if ($@) {
            die "Excelが入っていません。$@";
    }
    # EXCELオブジェクト取得
    eval {
            $Excel = Win32::OLE->GetActiveObject('Excel.Application')
                  || Win32::OLE->new('Excel.Application', 'Quit');
    };
    if ($@) {
            die "EXCELオブジェクト取得エラーです。 $@";
    }
    # Csvファイルオープン
    eval {
           $Excel->Workbooks->OpenText({Filename => "$csvFile"});
    };
    if ($@) {
            die "Csvファイルオープンエラーです。 $@";
    }
    $Excel->ActiveSheet->Cells->{NumberFormatLocal} = "@"; # すべてセルを文字列属性にする。
    $Excel->{DisplayAlerts} = 0; # 上書きのAlertダイアログを出さない。
    eval {
           $Excel->ActiveWorkbook->SaveAs({Filename => "$xlsFile", Fileformat => xlWorkbookNormal});
    };
    if ($@) {
            die "xlsファイル書き込みエラーです。 $@";
    }
    $Excel->ActiveWorkbook->Close();
    $Excel->Quit();
}
http://d.hatena.ne.jp/chaichanPaPa/20071130/1196424782

いろいろ調べてはみましたが、結論としては、わかりませんでした。
わかったことは、エラー0x800a03ecは、EXCELでファイルアクセスが出来ないときに出る感じです。
また、EXCEL2007では、IISやCOM経由で起動された場合には、なにかの設定があるのかもしれません。
何かご存知の方、もしよろしければ情報提供をお願いします。


ちなみに、IISやCOMのACL(アクセス制御リスト)は、EXCEL2003で大丈夫なので問題ないはずなのですが・・・。