プログラム

Laravelで、Excelファイルを作成し、ダウンロードする方法(テンプレート使用)

「PhpSpreadsheet」というPHP対応のExcel操作ライブラリを利用しました。

LaravelにインストールしたPhpSpreadsheetで、Excelファイルを作成し、それをPCにダウンロードする方法を調べました。

Excelファイルは、Excelテンプレートを用意しておき、セルに値を代入することで、作成します。

大まかな手順は、以下となります。

  1. LaravelにExcelテンプレートを設置
  2. Excelテンプレートのセルに値を代入し、Excelファイルを作成
  3. 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】。

  1. PCからサーバーに、template.xlsx をアップロード
  2. publicファルダ内に、excelフォルダを作成
  3. そこに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 デプロイ」を、参照してください。

 

 

 

参考資料

  1. ハマログ:PhpSpreadsheetとTcpdfでExcelファイルから日本語PDFを作成してみる(そして失敗する)
  2. 書籍:PHPフレームワーク Laravel Webアプリケーション開発:ダウンロードレスポンス
  3. Qiita:Content-Typeの一覧

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です