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

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

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

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

Q&A

解決済

4回答

27363閲覧

PHPExcel ダウンロードしたファイルが開けない。

earnest_gay

総合スコア615

PHP

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

1グッド

0クリップ

投稿2016/07/05 17:32

編集2016/07/06 02:39

PHPExcelでsave()したファイルは見れるけど、readfile()したファイルは形式が違うと表示され見れません。

//PHPExcelファイルの読み込み include_once ( __DIR__ . '/Classes/PHPExcel.php'); include_once ( __DIR__ . '/Classes/PHPExcel/IOFactory.php'); // Excel2007形式(xlsx)テンプレートの読み込み $reader = PHPExcel_IOFactory::createReader('Excel2007'); $excel = $reader->load( dirname(__FILE__) . '/template.xlsx' ); // シートの設定 $excel->setActiveSheetIndex(0);//何番目のシートか $sheet = $excel->getActiveSheet();//有効になっているシートを代入 // セルに値を入力 $sheet->setCellValue('A8', 'こんにちは!');//A1のセルにこんにちは!という値を入力 // Excel2007形式で出力する $writer = PHPExcel_IOFactory::createWriter($excel, 'Excel2007'); $writer->save(dirname(__FILE__) . '/output.xlsx'); //↑ここまでは順調 //↓ここからがなんかおかしい $file_path = dirname(__FILE__) . 'output.xlsx';//ダウンロードさせるファイルのパス $file_name = 'output.xlsx';//ダウンロードさせるファイル名 header("Content-Type: application/octet-stream");//ダウンロードの指示 header("Content-Disposition: attachment; filename=$file_name");//ダウンロードするファイル名 header("Content-Length:".filesize($file_path));//ダウンロードするファイルのサイズ ob_end_clean();//ファイル破損エラー防止 readfile(dirname(__FILE__) . '/./' . $file_path);//ダウンロード

saveしたファイル
正常に見れるやつ
イメージ説明

readfileしたやつ
開こうとすると
Excelファイル’○○○xlsx’を開くことができません。ファイル形式またはファイル拡張子が正しくありません。ファイルが破損しておらず、ファイル拡張子とファイル形式が一致していることを確認してください。
と表示される。
イメージ説明

どうしたら良いか知恵を貸してください。
宜しくお願いします。

OS:win10
Excel:2013


readfile(dirname(FILE) . '/./' . $file_path);//ダウンロード
こちらが問題でした。

現在のディレクトリを2回表示させるという意味わからないことしてました。
これでOK。
readfile($file_path);

これでファイルは読み込めるようになりましたがまだ問題が残っていました。

イメージ説明

イメージ説明

ちゃんとエラーなく表示させたいのですが
分かる方いらっしゃいましたら、教えていただけるとありがたいです。

【追記】

イメージ説明

ファイル名は同じです。
サイズが若干違います...

【追記】
問題のあるファイルを2つのエディタで開いてみましたがこれといったものがなさそうです...
イメージ説明

ユーザー向けにポップアップで表示させたいということです。
イメージ説明

mondaminZ👍を押しています

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

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

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

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

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

guest

回答4

0

ベストアンサー

面倒なので、修正版ソースを載せます。これでどうですか?
分かった!

php

1//PHPExcelファイルの読み込み 2include_once ( __DIR__ . '/Classes/PHPExcel.php'); 3include_once ( __DIR__ . '/Classes/PHPExcel/IOFactory.php'); 4 5// Excel2007形式(xlsx)テンプレートの読み込み 6$reader = PHPExcel_IOFactory::createReader('Excel2007'); 7$excel = $reader->load( __DIR__ . '/template.xlsx' ); 8 9// シートの設定 10$excel->setActiveSheetIndex(0);//何番目のシートか 11$sheet = $excel->getActiveSheet();//有効になっているシートを代入 12 13// セルに値を入力 14$sheet->setCellValue('A8', 'こんにちは!');//A1のセルにこんにちは!という値を入力 15 16// Excel2007形式で出力する 17$writer = PHPExcel_IOFactory::createWriter($excel, 'Excel2007'); 18 19$file_name = 'output.xlsx';//ダウンロードさせるファイル名 20header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');//ダウンロードの指示 21header("Content-Disposition: attachment; filename=$file_name");//ダウンロードするファイル名 22$writer->save('php://output'); 23exit; // これ入れてください 24``` `?>`で閉じてません?最後でexitしないと意図しないものが出力されてしまいます。

投稿2016/07/06 01:24

編集2016/07/06 03:23
shi_ue

総合スコア4437

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

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

earnest_gay

2016/07/06 01:57

回答ありがとうございます。 本質問の下部に追記しました。
shi_ue

2016/07/06 02:34 編集

ファイルの大きさが違うなら、どこかで警告などが出ているんじゃないですか? 前回同様ファイルをテキストエディタで開くと読める文がありませんか? なんか、ob_end_cleanが失敗しているように思うのですが・・・ ちっちゃいファイルだから一時的に取ってみては?
shi_ue

2016/07/06 02:50

そういえば、テンポラリに作ったファイルはエラーは出ませんか? 出ないなら、ダウンロードの過程がおかしいですよね。
earnest_gay

2016/07/06 03:03

すいません。 $file_path = __DIR__ . '/output.xlsx'; このスラッシュは気が付いて修正したんですが、こちらテラテイルの修正はしていなかったみたいです... header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); これでも変わらないです。 $writer->save('php://output'); これを追加したら何故かノーエラーで読み込めてます!
earnest_gay

2016/07/06 03:27

やっとできました! ありがとうございます。 exit;しないといけないんですね... 助かりました!
guest

0

ひょっとしてブラウザはChromeを使われていますか?だとすると
application/octet-streamはバグが報告されているので、
application/force-downloadにした方がいいです。

あと、自分が以前作った実務ページ(ie11のイントラですが)だと、ダウンロード部分だけを別ファイルにしました(これと同様のバグは発生しましたが、具体的なfix方法だったかは定かではないです…)。

投稿2016/07/06 02:50

FKM

総合スコア3608

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

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

earnest_gay

2016/07/06 02:54

回答ありがとうございます。 ブラウザはchromeで確認しています。 いくつか記事を拝見してforce-downloadにしたりもしたんですが、 下記のエラーがでるのでPHPExcelではサポートしていないのかと思い、元に戻しました... Warning: ZipArchive::close(): Renaming temporary file failed: Invalid argument in C:\xampp\htdocs\testonly\Classes\PHPExcel\Writer\Excel2007.php on line 398 Fatal error: Uncaught exception 'PHPExcel_Writer_Exception' with message 'Could not close zip file C:\xampp\htdocs\testonly/output.xlsx.' in C:\xampp\htdocs\testonly\Classes\PHPExcel\Writer\Excel2007.php:399 Stack trace: #0 C:\xampp\htdocs\testonly\test.php(21): PHPExcel_Writer_Excel2007->save('C:\\xampp\\htdocs...') #1 {main} thrown in C:\xampp\htdocs\testonly\Classes\PHPExcel\Writer\Excel2007.php on line 399
guest

0

PHPExcelは、ファイルを作らずに直接ダウンロードもできるようです。

PHP

1// Excel2007形式で出力する 2 $writer = PHPExcel_IOFactory::createWriter($excel, 'Excel2007'); 3 $writer->save('php://output'); 4 5/*ここからは一旦コメントアウト 6 //↑ここまでは順調 7 //↓ここからがなんかおかしい 8 9 $file_path = dirname(__FILE__) . 'output.xlsx';//ダウンロードさせるファイルのパス 10 $file_name = 'output.xlsx';//ダウンロードさせるファイル名 11 header("Content-Type: application/octet-stream");//ダウンロードの指示 12 header("Content-Disposition: attachment; filename=$file_name");//ダウンロードするファイル名 13 header("Content-Length:".filesize($file_path));//ダウンロードするファイルのサイズ 14 ob_end_clean();//ファイル破損エラー防止 15 readfile(dirname(__FILE__) . '/./' . $file_path);//ダウンロード 16*/

投稿2016/07/06 01:20

FKM

総合スコア3608

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

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

earnest_gay

2016/07/06 01:58

回答ありがとうございます。 しかしユーザー向けに普通の保存方法をさせたいのです。
shi_ue

2016/07/06 02:33

いやいや、上記で普通にユーザーは保存します。 ただ、一時的にファイルを作ったりしなくていいだけです。
earnest_gay

2016/07/06 02:41

試しましたがなりませんよ? どういう風にしたいか画像を追記しています。
shi_ue

2016/07/06 02:46 編集

あ、うそです。 ヘッダーの出力の後に、 $writer->save('php://output'); をやってみてください。そうすると一時的にファイルを保存しなくていいです。
earnest_gay

2016/07/06 02:59 編集

これでいけました! // Excel2007形式で出力する $writer = PHPExcel_IOFactory::createWriter($excel, 'Excel2007'); $writer->save(dirname(__FILE__) . '/output.xlsx'); $file_path = dirname(__FILE__) . '/output.xlsx';//ダウンロードさせるファイルのパス $file_name = 'output.xlsx';//ダウンロードさせるファイル名 header("Content-Type: application/octet-stream");//ダウンロードの指示 header("Content-Disposition: attachment; filename=$file_name");//ダウンロードするファイル名 header("Content-Length:".filesize($file_path));//ダウンロードするファイルのサイズ $writer->save('php://output'); ob_end_clean();//ファイル破損エラー防止 readfile($file_path);//ダウンロード が、何がどうなっているのやら分からずモヤモヤ... $writer->save('php://output'); と1行加えただけです。
shi_ue

2016/07/06 03:04 編集

めちゃくちゃや・・・本当はここに書きたくないけど・・・ $writer = PHPExcel_IOFactory::createWriter($excel, 'Excel2007'); $file_name = 'output.xlsx'; header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); header("Content-Disposition: attachment; filename=$file_name"); $writer->save('php://output'); ってな感じで良いですよ。
earnest_gay

2016/07/06 03:15

変わらず、一部の内容に問題が見つかりました、とでます...
guest

0

その壊れたファイルを、テキストエディタで開いてみてください。
おそらくPHPのエラーやHTMLの記述が混ざって書かれているはずです。

投稿2016/07/05 17:46

編集2016/07/05 17:52
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

earnest_gay

2016/07/05 17:57

回答ありがとうございます。 readfile(C:\xampp\htdocs\testonly/./C:\xampp\htdocs\testonly/output.xlsx): failed to open stream: Invalid argument in <b>C:\xampp\htdocs\testonly\test.php</b> on line <b>29</b><br /> と表示があったので readfile($file_path) に変更して多少マシになり読み込めるようになりました。 今度は 一部の内容に問題が見つかりました。可能な限り回復しますか?ブックの発行元が信頼できる場合は、[はい]をクリックしてください のエラーがでてしまいます... こちらでも原因調査して解決したいとおもいます...
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問