Laravelで、Excelファイルを作成し、ダウンロードする方法(テンプレート使用)
Contents
「PhpSpreadsheet」というPHP対応のExcel操作ライブラリを利用しました。
LaravelにインストールしたPhpSpreadsheetで、Excelファイルを作成し、それをPCにダウンロードする方法を調べました。
Excelファイルは、Excelテンプレートを用意しておき、セルに値を代入することで、作成します。
大まかな手順は、以下となります。
- LaravelにExcelテンプレートを設置
- Excelテンプレートのセルに値を代入し、Excelファイルを作成
- Excelファイルを、PCにダウンロード
Excelテンプレートの読み込みから、Excelファイルを作成するまでは、PhpSpreadsheetを利用しました。
- PHP上の各種Excel操作は、PHPSpreadsheet を利用
準備(php-zip, Composerアップデート)
Php-zipやComposerをアップデートしないと、PhpSpreadsheetのインストールに失敗します。
最初に、これらをアップデートします。
Composer は、既に、以下の位置にインストール済みとします【注1】。
/var/www/composer.phar
【注1】Composer のインストールがまだの場合は、記事記事「さくらのVPS:Laravel デプロイ」を、ご参照ください。
以下のコマンドで、php-zip をアップデートします。
www#yum -y install --enablerepo=remi, remi-php73 php-zip
ここで、www# はコマンドプロンプトです。wwwは現在のログイン位置を、#はルートでのログインを、表しています。
そして、以下のコマンドで、composerをアップデートします。
www#php composer.phar update
Laravelインストール
プログラム名「sample」で、Laravel をインストールします【注2】。
/var/www/sample
【注2】Laravel インストールの詳細は、記事「さくらのVPS:Laravel デプロイ」を、参照してください。
今回、composer, artisanは以下の位置にあります。
/var/www/composer.phar /var/www/sample/artisan
Laravel のバージョンを確認します。
sample#php artisan --version
例えば、Laravel Framework5.8.16 などと、返ってきます。
PhpSpreadsheetインストール
次に、PhpSpreadsheetをインストールします【注3】。
sample#php ../composer.phar require phpoffice/phpspreadsheet
【注3】この辺りは、参考資料1. に準拠しています。詳細は、参考資料1. をご参照ください。
template.xlsx設置
次に、テンプレートとなるExcelファイル(template.xlsx)を設置します【注4】。
- PCからサーバーに、template.xlsx をアップロード
- publicファルダ内に、excelフォルダを作成
- そこにtemplate.xlsxを設置
/var/www/sample/public/excel/template.xlsx
【注4】この辺りは、参考資料1. に準拠しています。詳細は、参考資料1. をご参照ください。
プログラミング
次に、web.phpを修正し、HomeController.phpを新規作成します【注5】。
【注5】この辺りは、参考資料1.2.3. に準拠しています。詳細は、参考資料1.2.3. をご参照ください。
sample/routes/web.php の修正
プログラム1.web.php
<?php /* コメントアウト、もしくは、削除 Route::get('/', function () { return view('welcome'); }); // (a) */ Route::get('/', 'HomeController@index'); // (b)
ソースの説明
(a)Laravelをインストールしたに、Laravelにアクセスすると、「welcome」が表示されます。
この部分は、コメントアウトします。
(b)Laravelにアクセスすると、HomeControllerオブジェクトのindexメソッドが動きます
sample/app/Http/Controllers/HomeController.php の作成
プログラム2.HomeController.php
<?php namespace App\Http\Controllers; use PhpOffice\PhpSpreadsheet\IOFactory; use PhpOffice\PhpSpreadsheet\Shared\File; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; use Illuminate\Http\Request; use Symfony\Component\HttpFoundation\BinaryFileResponse; class HomeController extends Controller: BinaryFileResponse { public function index() { $spreadsheet = IOFactory::load(public_path() . '/excel/template.xlsx'); // (a) $sheet = $spreadsheet->getActiveSheet(); // (b) $sheet->setCellValue('I4', 'AAA BBBB'); // (c) $sheet->setCellValue('I11', '9:00'); $sheet->setCellValue('J11', '17:30'); $sheet->setCellValue('P11', '作業A'); File::setUseUploadTempDirectory(public_path()); $writer = new Xlsx($spreadsheet); $writer->save(public_path() . '/excel/output.xlsx'); // (d) return response()->download(public_path() . '/excel/output.xlsx', 'filename.xlsx', ['content-type' => 'application/vnd.ms-excel',]) // (e) ->deleteFileAfterSend(true); // (f) } }
ソースの説明
(a)load()関数で、テンプレート(template.xlsx)を、$spreadsheetに読み込む
(b)$spreadsheetの1枚目のシート(ActiveSheet)を、$sheet に代入
(c)$sheetのセル(’I4’)に、 ‘aaa bbbb’ を、セットする’’
- フォント特性(名、サイズ、色、など)や、セル結合などは、テンプレートに設定済み
- 同様に、セル(’I11’, ’J11’, ’P11’)に、値をセット
(d)各セルに値を設定したExcelファイルを、以下の場所に書き出す
/var/www/sample/public/excel/output.xlsx
(e)output.xlsxを、PCにファイル名(filename.xlsx)でダウンロードする
/PC/ダウンロード/filename.xlsx
(f)ダウンロード後、output.xlsxを、excelフォルダから削除する
Web 経由での動作確認
ブラウザーで、URL(http://111.22.333.44/)にアクセスすると、プログラム が動きます【注6】。
【注6】ip アドレス(111.22.333.44)は、適宜、各自の ip アドレスに読み替えてください。
- http://111.22.333.44
ランタイムエラー(permission denied)
このまま、URL(http://111.22.333.44/)【注6】にアクセスすると、excelフォルダに書き込みできないとのエラーになります。
そこで、以下のコマンドを実行します。
#chmod -R 775 /var/www/sample/public/excel #chcon -R -t httpd_sys_rw_content_t /var/www/sample/public/excel #chown -R apache:apache /var/www/sample
コマンドの詳細は、記事「さくらのVPS:Laravel デプロイ」を、参照してください。
参考資料
- ハマログ:PhpSpreadsheetとTcpdfでExcelファイルから日本語PDFを作成してみる(そして失敗する)
- 書籍:PHPフレームワーク Laravel Webアプリケーション開発:ダウンロードレスポンス
- Qiita:Content-Typeの一覧