
お世話になります。
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つのときと、複数のときで違いがあるのでしょうか?
No.3ベストアンサー
- 回答日時:
間が空いてしまってすいません
ご質問に開いて閉じると書いてあったので画面上の話かと思いました
ファイルのopen/closeの話だったんですね
失礼いたしました
Webで利用するCSV変換ということで
Excel2003までなら「Spreadsheet::ParseExcel」
Excel2007なら「Spreadsheet::XLSX」
をcpanからダウンロードして利用するとよいと思います
とくに前者はサンプルが充実していて大変参考になります
後者も使い方がシンプルでCPANのサイトの紹介コードで充分理解できます
どちらもPurePerlなので、サーバのPerlモジュールとしてビルド・インストールしなくても「use lib」で簡単に扱えるのが特徴です
数年前に実際に使ったことがありますが、シートが複数でも問題無かったうえにレンタルサーバ上でも動作しました
何度もアドバイスを本当にありがとうございました。
こちらもお返事が遅れてしまい、大変失礼いたしました。
現在、教えて頂いたParseExcel、XLSXを試しているところです。
結局自分の行った初期の方法では、複数シートのときの問題は解決できておらず、
強引な手法なのですが…必要なシートのみにして(使用しないシートを削除)
処理を行うという方法しか見つけられませんでした。
これではすっきりしないというか怖いというか、
根本的な解決になっていない気がするので、教えて頂いた方法で作り変えようとしています。
こちらの質問の仕方も誤解を招く表現ばかりで申し訳ありませんでした。
最後までアドバイス頂き、とても感謝しております。
ありがとうございました。
No.2
- 回答日時:
少し誤解があるようですので追補させて下さい
> windowsで動作すればよいとのことから
今、あなたが動作させているのは決してWindowsというプラットホームではありません
ネット(この場合loopbackというやつ)とHTTP(俗にWebとかインターネットとか言われてる)を介してApacheサーバのWindows上で動作させているのです
ここでいうところの「Windowsで」というのは、察するにperl環境なのでアイコン(拡張子PL)をダブルクリックまたはコマンドプロンプトからのコマンドラインによるPerlスクリプトの実行となるんじゃないでしょうか?
> win32 OLEを使用しましたが、ParseExcelであれば問題ないのですね。
ケースバイケースです
普通に実行するだけならWin32 OLEでも問題ありません
Win32 OLEで作られたプログラムを普通とは違うやり方で実行されているのが問題なのです
Wordやパワポをブラウザ経由で起動して使ったりはしないでしょう?(あ、最近ではそんなサービスアプリもありますね → ネットリソースの無駄遣いってやつ)
長々と失礼いたしました
色々とありがとうございます。
実行は、ブラウザを利用しています。
さまざまな書式のファイル(エクセルやテキストファイル)を読み込んで、
統一した書式のcsvを作り出すプログラムとなります。
ブラウザでエクセル起動(表示?)等はせず、
ファイル名、その他の設定をして、実行します。
プログラムは、ファイルがエクセルファイルなのか、テキストファイルなのかを認識し、
読み込み、書式を変更してcsvファイルを書きだします。
すでにプログラムは出来ている状態なのですが、ワークシートが複数のエクセルの場合にのみ
戻ってこなくなるので、その部分の修正なのですが、
作り自体を見直す必要があるのですね。
No.1
- 回答日時:
ApacheからCGI経由で「サーバ上画面」に「Excel開く」ことに何の意味があるのかよくわかりません
見かけ上ローカルでやってるつもりかもしれませんが、機器やアプリ構成そのものをじっくり考えてください
無意味に仲介しているApacheが空しいです
ブラウザやApache・CGIを介さずそのまま実行してやればちゃんと動きませんか?
Perlは本来システム保守用に開発された言語ですのでCGIだけがPerlじゃありません
またCGI経由でExcelデータをコントロールするなら
Spreadsheet::ParseExcel
Spreadsheet::WriteExcel
あたりを使ってブラウザ外の画面上には風呂敷広げないのが普通かと思います
アドバイスありがとうございます。
今回は、色々なフォーマットのエクセルファイルを読み込み、一定の書式のcsvとして出力するものを作成しています。
windowsで動作すればよいとのことから
win32 OLEを使用しましたが、ParseExcelであれば問題ないのですね。
そちらでも試してみたいと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Perlのエラーについてご教授く...
-
フローチャート 九九
-
bashスクリプト
-
Perlで時間の計算
-
Perl言語について。
-
#!/usr/bin/perlで書きだしたCG...
-
ファイルアイコンの左下に緑の□...
-
perlの構文でカンマの意味が分...
-
perlをバージョンアップしたら...
-
Blenderについて
-
Perl の外部モジュールの利用方法
-
Strawberry Perl for Windows ...
-
openした後、closeしないでプロ...
-
テキストファイルで提出とは?
-
perl LWPでURLにアクセスした時...
-
perlで文字の置換又は抽出に関...
-
perl の open について教えてく...
-
ファイルをディレクトリ分配の...
-
アルファベットに付いて質問し...
-
perlのflock関数でロックをかけ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
無料配布の郵便番号自動入力cgi...
-
Perl で ディレクトリ及びサブ...
-
標準入出力 パイプ
-
PerlとUnixの関係
-
Perl-CGI で排他制御はどうすれ...
-
cookieを必要とするページへのLWP
-
あるURLがファイルなのかディレ...
-
perl上からfindを使い検索した...
-
シェルスクリプトの作成方法
-
配列を使ってファイル名のリネーム
-
エラーログ「\\x8ew\\x92\\xe8...
-
詳しい方教えて頂けませんでし...
-
Perlファイルテスト演算子が正...
-
unlink 、renameが使えない理由
-
MacOSXでのPerlプログラミング
-
ディレクトリ名の変更
-
コマンドプロンプトからperlを...
-
AuthUserFile用に登録するためには
-
エクセルVBA コードが同じでも...
-
VBAでCSVファイルを途中行まで...
おすすめ情報