質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

3700閲覧

PHPExcelでエクセルの出力中ローディングを表示させたい

yusukesasaki

総合スコア28

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2017/06/09 01:25

PHPExcelを使用し、ボタンをクリックでエクセルを出力してるのですが、処理に時間がかかることが多いためローディングを表示させたいと思っています。

ボタンクリック時にJavaScriptでローディングを表示することは出来るのですが、出力後にローディングを消す方法を探しています。

かなり省略していますが、以下のような状態です。

<?php require __DIR__ . '/vendor/autoload.php'; if ($_SERVER['REQUEST_METHOD'] === 'POST') { $book = new PHPExcel(); $sheet = $book->getActiveSheet(); $book->getActiveSheet()->setTitle('test'); header('Content-Type: application/vnd.ms-excel'); header('Content-Disposition: attachment;filename="output.xlsx"'); header('Cache-Control: max-age=0'); $writer = PHPExcel_IOFactory::createWriter($book, 'Excel2007'); $writer->save('php://output'); exit; } ?> <!DOCTYPE html> <html lang="ja"> <head> <title>PHPExcel</title> </head> <body> <form action="" method="post"> <input type="submit" value="出力"> </form> <script> // ローディングを表示 </script> </body> </html>

submitをクリックすると、エクセルはダウンロードされますがローディングが表示されたままになってしまいます。
ajaxを使用してjavascriptでリダイレクトをしようと試してみましたがうまくいきませんでした。

何かいい方法があればご教示いただけると助かります。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

onclickとonloadをイベントの開始終了に設定すればよいのではないでしょうか。

出力ボタンを押す

onclickでローディング表示

onloadでbody部がすべて処理できたら

ローディング表示解除

の流れとなります。

投稿2017/06/09 01:39

s.t.

総合スコア2021

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yusukesasaki

2017/06/09 01:59

回答ありがとうございます。 <body onload="処理"> という認識でよろしいでしょうか。 試してみましたが、submitしてもページが再読み込みされないので、処理が走りませんでした。
yusukesasaki

2017/06/09 02:22

ありがとうございます。 actionは action="./" とするようにしました。 submitにはidを付けて、<script>内で addEventListener('click', function(){ ・・・ としてローディングを表示しています。ローディングの表示はうまくいっています。 submitしてもページが再読み込みされないので <body onload="処理"> の処理が走らないのだと思います。
s.t.

2017/06/09 02:31

とりあえず、色々やり方はあるのですが、ダウンロードが完了したことを検知する仕組みを入れてみるのもよいかもしれません。 ダウンロードが完了したらcookieを書き換える機能+ローディング表示中にcookieをポーリングしておくことで完了は検知できると思われます。 【参考URL】 http://qiita.com/hidakatsuya/items/1b970d17ecb016dddec7
s.t.

2017/06/09 02:34

先程のonloadの処理が動かない件は、どのように確認しましたでしょうか? ブラウザの開発ツールなどで確認できましたでしょうか? あと、PHP部分をbodyに放り込んでやることも必要だと思います。
yusukesasaki

2017/06/09 02:52

ありがとうございます。 cookieを使う方法で試してみます。結果はまた報告させていただきます。 onloadの処理は、例えばalertを仕込んでいた場合、初回ページ表示時には実行されますが、submit後は実行されませんでした。
s.t.

2017/06/09 02:54

あれっ、そうなんですね~・・・ぼくもまだまだ勉強不足です・・・。 申し訳ありません。
yusukesasaki

2017/06/09 04:45

cookieを試してみましたが、エクセルの出力に時間がかかる場合、出力よりも先にcookieがセットされてしまって、ローディングが消えてしばらくしてエクセルがダウンロードされるかたちになってしまいました。 エクセルの出力が終わった後にcookieをセットする方法があればいいのですが…。
yusukesasaki

2017/06/09 05:20

すみません、できました!(cookieの削除がうまくいっていませんでした)
s.t.

2017/06/09 05:22

おお、よかったです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問