アプリ版:「スタンプのみでお礼する」機能のリリースについて

お世話になります。

win7
ActivePerl 5.16.3
Apache HTTP Server 2.0

perlからエクセルファイルを読み込むプログラムを作成しています。

----
use Win32::OLE;
use Win32::OLE::Const 'Microsoft Excel';
Win32::OLE->Option(Warn => 3);

eval{
Win32::OLE->GetActiveObject('Excel.Application');
};
if($@){
die "Excelが使用できません。$@";
}

unless (defined $Excel){
$Excel = Win32::OLE->new('Excel.Application', sub {$_[0]->Quit;})
or die "Excelが起動できません。";
}

my $Book = $Excel->Workbooks->Open("Excelファイルのフルパス")
or die Win32::OLE->LastError();
$Book->Close;
$Excel->Quit();
----

現在は単純に、開いて、閉じるだけの状態です。
ワークシートが1つのエクセルファイルは問題ないのですが、
2つ以上ワークシートがあるエクセルファイルを開くと、$Book->Closeのところで戻ってこなくなります。(ブラウザで待機中の状態)
該当のエクセルファイルは、開いた状態です(直接エクセルで開いてみると編集のためロックされていますと出る)ので、Openは出来ているような気がします。
$Book->Closeを書かなければ下に流れていきますが、
プロセスが残ってしまいます。

ワークシートが1つのときと、複数のときで違いがあるのでしょうか?

A 回答 (3件)

ApacheからCGI経由で「サーバ上画面」に「Excel開く」ことに何の意味があるのかよくわかりません


見かけ上ローカルでやってるつもりかもしれませんが、機器やアプリ構成そのものをじっくり考えてください
無意味に仲介しているApacheが空しいです

ブラウザやApache・CGIを介さずそのまま実行してやればちゃんと動きませんか?
Perlは本来システム保守用に開発された言語ですのでCGIだけがPerlじゃありません

またCGI経由でExcelデータをコントロールするなら
Spreadsheet::ParseExcel
Spreadsheet::WriteExcel
あたりを使ってブラウザ外の画面上には風呂敷広げないのが普通かと思います
    • good
    • 0
この回答へのお礼

アドバイスありがとうございます。
今回は、色々なフォーマットのエクセルファイルを読み込み、一定の書式のcsvとして出力するものを作成しています。

windowsで動作すればよいとのことから
win32 OLEを使用しましたが、ParseExcelであれば問題ないのですね。
そちらでも試してみたいと思います。

お礼日時:2013/10/10 08:53

少し誤解があるようですので追補させて下さい



> windowsで動作すればよいとのことから
今、あなたが動作させているのは決してWindowsというプラットホームではありません
ネット(この場合loopbackというやつ)とHTTP(俗にWebとかインターネットとか言われてる)を介してApacheサーバのWindows上で動作させているのです
ここでいうところの「Windowsで」というのは、察するにperl環境なのでアイコン(拡張子PL)をダブルクリックまたはコマンドプロンプトからのコマンドラインによるPerlスクリプトの実行となるんじゃないでしょうか?

> win32 OLEを使用しましたが、ParseExcelであれば問題ないのですね。
ケースバイケースです
普通に実行するだけならWin32 OLEでも問題ありません
Win32 OLEで作られたプログラムを普通とは違うやり方で実行されているのが問題なのです
Wordやパワポをブラウザ経由で起動して使ったりはしないでしょう?(あ、最近ではそんなサービスアプリもありますね → ネットリソースの無駄遣いってやつ)

長々と失礼いたしました
    • good
    • 0
この回答へのお礼

色々とありがとうございます。

実行は、ブラウザを利用しています。
さまざまな書式のファイル(エクセルやテキストファイル)を読み込んで、
統一した書式のcsvを作り出すプログラムとなります。

ブラウザでエクセル起動(表示?)等はせず、
ファイル名、その他の設定をして、実行します。

プログラムは、ファイルがエクセルファイルなのか、テキストファイルなのかを認識し、
読み込み、書式を変更してcsvファイルを書きだします。

すでにプログラムは出来ている状態なのですが、ワークシートが複数のエクセルの場合にのみ
戻ってこなくなるので、その部分の修正なのですが、
作り自体を見直す必要があるのですね。

お礼日時:2013/10/11 16:34

間が空いてしまってすいません


ご質問に開いて閉じると書いてあったので画面上の話かと思いました
ファイルのopen/closeの話だったんですね
失礼いたしました
Webで利用するCSV変換ということで
 Excel2003までなら「Spreadsheet::ParseExcel」
 Excel2007なら「Spreadsheet::XLSX」
をcpanからダウンロードして利用するとよいと思います
とくに前者はサンプルが充実していて大変参考になります
後者も使い方がシンプルでCPANのサイトの紹介コードで充分理解できます
どちらもPurePerlなので、サーバのPerlモジュールとしてビルド・インストールしなくても「use lib」で簡単に扱えるのが特徴です
数年前に実際に使ったことがありますが、シートが複数でも問題無かったうえにレンタルサーバ上でも動作しました
    • good
    • 0
この回答へのお礼

何度もアドバイスを本当にありがとうございました。
こちらもお返事が遅れてしまい、大変失礼いたしました。

現在、教えて頂いたParseExcel、XLSXを試しているところです。
結局自分の行った初期の方法では、複数シートのときの問題は解決できておらず、
強引な手法なのですが…必要なシートのみにして(使用しないシートを削除)
処理を行うという方法しか見つけられませんでした。
これではすっきりしないというか怖いというか、
根本的な解決になっていない気がするので、教えて頂いた方法で作り変えようとしています。

こちらの質問の仕方も誤解を招く表現ばかりで申し訳ありませんでした。
最後までアドバイス頂き、とても感謝しております。
ありがとうございました。

お礼日時:2013/11/19 10:37

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!