CakePHP3でPHPExcelを使ってエクセルファイルを生成、出力する方法
2017/11/03
CakePHP3でPHPExcelを使ってエクセルファイルを生成、出力
PHPExcelをインストール
composerコマンドを使って PHPExcelをインストールします。
|
1 |
composer require phpoffice/phpexcel |
composerコマンドの使い方については、「CakePHP3でcomposerを利用してライブラリ・プラグインをインストールする方法」を参照してください。
composerコマンドを実行すると、「phpoffice/phpexcel」のパッケージがインストールされるだけではなく、CakePHP3で利用するために必要なファイルの更新も行ってくれます。
具体的には、ルートフォルダにある「/composer.json」「/composer.lock」ファイルが更新されます。
「/composer.json」には、「require」の値として、インストールしたパッケージの情報が追加されます。
|
1 2 3 4 |
"require": { : "phpoffice/phpexcel": "^1.8" }, |
また、「/composer.lock」には、ファイルのパスやバージョン、権限などの設定情報が追加されます。追加される情報はかなり多いので、ここでは割愛します。
CakePHP3でPHPExcelでエクセルファイルを読み込み、値を編集し、保存する処理のサンプル
CakePHP3でPHPExcelのプラグインを利用するために use句を記述
まず初めに、PHPExcelを利用するコントローラーに下記の「use句」を追記します。
|
1 |
use PHPExcel_IOFactory; |
設定にもよりますが、「/vendor/cakephp-plugins.php」や「/config/bootstrap.php」にプラグインをロードする処理を記述する必要はありません。
CakePHP3でPHPExcelを利用しエクセルファイルを出力する処理サンプル
ゼロからエクセルファイルを生成し、罫線を引いたり、セルの色を変更したり、という方法もありますが、より簡単な方法として、ここではあらかじめ作成したテンプレートファイルに、値を編集していく、という方法を解説します。
そのサンプルプログラムが以下になります。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
public function download ( $id = null ){ $HogeHoge = $this->HogeHoges->get($id, [ 'contain' => [] ]); // 入出力の情報設定 $driPath = realpath(TMP) . "/excel/"; $inputPath = $driPath . "templete.xlsx"; $sheetName = "data_sheet"; $outputFile = "output_" . $id . ".xlsx"; $outputPath = $driPath . $outputFile; // Excalファイル作成 $reader = PHPExcel_IOFactory::createReader('Excel2007'); $book = $reader->load($inputPath); $sheet = $book->getSheetByName($sheetName); // データを配置 $sheet->setCellValue("B3","B3の位置"); $sheet->setCellValue("B4","B4の位置"); // 保存 $book->setActiveSheetIndex(0); $writer = PHPExcel_IOFactory::createWriter($book, 'Excel2007'); $writer->save($outputPath); return $this->redirect(['action' => 'index']); } |
それぞれコメントを書いているので分かるかと思いますが、最初に、テンプレートとして取得するファイル名などを指定します。
テンプレートのファイルは「$driPath」に編集していますが、「realpath(TMP) . "/excel/";」としています。
「realpath(TMP)」は、「/tmp」に当たります。
「/tmp」の中に「excel」というフォルダを作って、その中にテンプレートとなるエクセルファイルを設置します。
ファイルの保存先のフォルダのパスについては、下記の記事を参考にしてください。
CakePHP3でDocumentRootやtmp、webroot、logsなどのフォルダへのパスの定数
CakePHP3でDocumentRootやwebroot、imgフォルダのURLやドメイン、パスを取得
2007形式(.xlsx形式)と 2003以前の形式(.xls形式)の切り替え
「$reader = PHPExcel_IOFactory::createReader('Excel2007');」の「Excel2007」は、エクセルの 2007形式(.xlsx形式)で保存する指定です。
エクセルの 2003以前の形式(.xls形式)で保存する場合は、「Excel2007」の部分を「Excel5」に置き換えます。
ファイルを保存せずにダウンロードさせる方法
上記のサンプルは、所定のフォルダにエクセルファイルを保存する処理になっています。
ファイルを保存せずに、ダウンロードする場合は、「保存」の処理 3行を下記のものに差し替えます。(ソースコードに間違いがありましたので修正しました。2017.11.03)
|
1 2 3 4 5 6 7 8 9 |
// ダウンロード header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment;filename="' . $outputFile . '"'); header('Cache-Control: max-age=0'); $book->setActiveSheetIndex(0); $writer = PHPExcel_IOFactory::createWriter($book, 'Excel2007'); $writer->save('php://output'); exit; |
上記の処理の
|
1 |
header('Content-Type: application/octet-stream'); |
は
|
1 |
header('Content-Type: application/vnd.ms-excel'); |
でも動作します。
ただ、ブラウザによっては、自動的にブラウザで開こうとしてしまうことがありますので、「application/octet-stream」の方がお勧めです。
また、ダウンロード処理の場合は、最後の行の「exit();」が必要です。
この「exit();」がないと「読み取れなかった内容を修復または削除することにより、ファイルを開くことができました。」「ファイルレベルの検証と修復が完了しました。このブックの一部が修復されたか、破棄された可能性があります。」と表示されてしまいますので、忘れないようにしましょう。
CakePHP3の関連記事
CakePHPのpostlinkで生成した削除リンクをクリックしても処理が実行されない対処法CakePHP4のCSS、JavaScript、画像のブラウザへのキャッシュをコントロールする
CakePHP3でレコードを保存(追加、更新、Insert、Update)する複数の方法を紹介
CakePHP3でモデルなしフォームからCSVをアップロードしレコードを更新する方法解説
CakePHP3でPHP Simple HTML DOM Parserを使ってスクレイピングする方法
CakePHP3のInsert On Duplicate Key Update(upsert)構文を解説・バルク処理も
CakePHP3の1対多での連携を中間テーブルを使った多対多の連携に変更するときの手順
CakePHP3でデフォルトのソート条件を設定してユーザの選択肢たソート条件を有効にする方法
CakePHP3で Ajaxを使う方法の解説。3.6以降対応。Successとthenの両方を解説。
CakePHP3でパンくずの指定は HTMLヘルパーを使って指定する方法を解説
その他の「CakePHP3」に関する記事一覧
GoogleAdwords
GoogleAdwords
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
-
CakePHP4で「app_local.php」「.env」を利用して環境ごとの定数を振り分ける方法
CakePHP4で.env、app_local.phpに定数を定義してそれを呼び出す方法の解説。Gitでは管理せず本番環境と開発環境とで異なる定数を定義するためそれを利用する方法。
-
-
CakePHPを学ぶ際にはオブジェクト指向を学ぼう
CakePHPはオブジェクト指向で書かれていますので、CakePHPを学ぶにはオブジェクト指向も学びましょう。
-
-
CakePHP3、CakePHP4のキャッシュをクリアする方法「bin/cake cache clear_all」を使う
CakePHP3、CakePHP4では処理を高速化する手法の一つとしてキャッシュを利用している。しかし、その情報は元の情報を更新しても反映されない場合がある。そんなときはキャッシュを削除する必要がある。
-
-
CakePHP4のフラッシュメッセージの表示場所、デザインを変更する方法を解説
CakePHP4のエラーメッセージ、完了メッセージなどを表示するフラッシュ処理の解説。Controller、レイアウトファイル、テンプレートファイルでそれぞれ処理を指定する。
-
-
CakePHP3のInsert On Duplicate Key Update(upsert)構文を解説・バルク処理も
CakePHP3で Insert … On Duplicate Key Update構文(upsert)を実行する方法を解説。バルク処理の方法も用意されているため大量処理の場合も対応可能。
-
-
CakePHP4の定数定義ファイルを環境変数によって本番と開発を振り分ける方法解説
CakePHP4で開発環境と本番環境とで違う設定ファイルを読み込ませて環境ごとに定数を切り替える方法を解説。Apacheのhttpd.confに環境変数を設定しそれを読み込み判別する。
-
-
CakePHP3ログファイルへの出力・$this->log()、独自ログへの出力方法の解説
コントロール、モデルの変数の中身を見るときはログに出力する方法が有効です。$this->log()を利用すると変数だけじゃなく、連想配列、オブジェクトも簡単にログ出力ができます。
-
-
CakePHP4、5でSELECT telephone as tel FROM usersの様にasでカラムに別名を付ける方法
CakePHP4、CakePHP5でクリエビルダーを利用してテーブルからレコードを取得する際、asを使用してカラムの別名で値を取得したい場合の対応方法を解説。また、別名にはハイフンやアスタリスクなど使用できない文字がある点も解説。
-
-
CakePHPのpostlinkで生成した削除リンクをクリックしても処理が実行されない対処法
CakePHP環境にてpostLinkで生成した削除のリンクをクリックしても処理が実行されず、JavaScriptでUncaught TypeErrorが発生。原因は同一IDを複数記述していることだった。
-
-
CakePHP3にデイトピッカー jQuery UI DatePickerを実装する手順の解説
CakePHP3にjQuery UIのDatePickerを実装する手順を説明。併せて、デイトピッカーを設置に関連するCakePHP3の解説と、テーマを変更したり、表記を変更するカスタマイズする方法なども紹介。


Comment
参考になりました。
ありがとうございます。
ちなみにダウンロードの場合の箇所で、$excelだと動かず、$bookだと動きました。
$excel->setActiveSheetIndex(0);
$writer = PHPExcel_IOFactory::createWriter($excel, ‘Excel2007’);
とおりすがりさん、コメントありがとうございます。
お役に立てて何よりですが、ソースコードが間違っておりまして申し訳ありません。
指摘いただきました箇所、修正させていただきました。
ありがとうございました。今後ともよろしくお願いします!