以前の記事「Laravelでmaatwebsite/excelインストールとエクセル出力方法」ではusersテーブルのデータをそのままgetでエクスポートし、エクセルに出力しましたが今回usersテーブルの検索結果(postデータ)をエクセルで出力する方法をご紹介します。
(Laravelバージョンは6.18.39)
検索を行うusersテーブルを用意
以下のusersテーブルを用意しました。usersテーブルよりname(ユーザー名)カラム内のデータをlike検索します。
usersテーブル
| 名前 | 説明 | 
|---|---|
| id | 主キー | 
| name | ユーザー名 | 
| メールアドレス | 
usersテーブルの内容を全てveiwに出力するclassを作成
usersテーブルの検索結果をveiw(exports/excelusers.blade.php)に出力する以下のclass(/app/Exports/Excelusers.phpファイル)を作成します。
<?php
namespace App\Exports;
use Maatwebsite\Excel\Concerns\FromView;
use Illuminate\Contracts\View\View;
class Excelusers implements FromView
{
    protected $users;
  
    function __construct($users) {
      $this->users = $users;
    }
  
    public function view(): View
    {
      //下記追加 「excel.xxxxx」の部分はviewまでのrootを記載
      return view('exports.excelusers', [
        'users' => $this->users,
      ]);
    }
}
?>
エクセルファイル出力内容のview(/exports/excelusers.blade.phpファイル)の記述
エクセルファイルに出力する内容のview(/resources/views/exports/excelusers.blade.phpファイル)の記述は以下の通りです。「name」と「email」をエクセルに出力します。
<p>userテーブル</p>
<table>
  <thead>
  <tr>
      <th>Name</th>
      <th>Email</th>
  </tr>
  </thead>
  <tbody>
  @foreach($users as $user)
      <tr>
          <td>{{ $user->name }}</td>
          <td>{{ $user->email }}</td>
      </tr>
  @endforeach
  </tbody>
</table>
エクセルファイル(users.xlsx)を出力するControllerの記述
usersテーブルのname(ユーザー名)カラム検索結果をエクセルファイル(users.xlsx)に出力するController(/app/Http/Controllers/ExcelusersController.phpファイル)の記述は以下の通りです。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use DB;
use App\Exports\Excelusers;
use Maatwebsite\Excel\Facades\Excel; 
class ExcelusersController extends Controller
{
    //検索結果エクセル出力
    public function excelresult(Request $request)
    {
        $sql = '1=1';
        $username = "";
        if(!empty($request->username)){
            $username = $request->username;
            $sql .= " AND users.name like '%".$username."%'";	//usersテーブルのnameカラムをlike検索
        }
        
        $users = DB::select("SELECT * FROM users WHERE ".$sql." ORDER BY id DESC");
        return Excel::download(new Excelusers($users), 'users.xlsx');
    }
}
エクセル出力URL(/routes/web.php)の記述
エクセル(users.xlsx)出力URL(post)を/routes/web.phpに記述します。
<?php
Route::post('/excelusers', 'ExcelusersController@excelresult');
?>
検索入力画面のview(serchuser.blade.phpファイル)の記述
usersテーブルのnameカラムを検索する入力画面のview(/resources/views/serchuser.blade.phpファイル)の記述は以下の通りです。
(検索入力画面のmodel(class)、Controller、web.phpの記述は省略します)
        <form enctype="multipart/form-data" action="{{ url('excelusers') }}" method="POST" class="form-horizontal">
            @csrf
                <div>エクセルで出力したいusersテーブルに登録されている名前を入力して下さい</div>
                <input type="text" name="username" value="">
                <div>
                    <button type="submit" class="btn btn-primary">
                    検索結果出力
                    </button>
                </div>
        </form>
 
※web.phpに記述した「/usersexport」に入力画面のデータをpostするとusersテーブルnameカラムの検索結果が「users.xlsx」に出力されます。
まとめ
Laravelで検索結果(POSTデータ)をExcel形式で出力する方法は、ユーザーの条件に応じたデータを柔軟に保存・共有できる便利な機能です。
今回の記事では、`maatwebsite/excel`を用いて、検索フォームの入力内容を受け取り、該当するusersテーブルのデータのみを抽出し、エクセルファイル(users.xlsx)としてダウンロードさせる一連の流れを紹介しました。
特に、以下のポイントを押さえることでスムーズに実装できます。
- POSTリクエストを受け取るフォームの作成
- 検索条件に応じたSQLクエリの生成
- 検索結果を渡すエクスポート用クラスの作成
- エクセル出力用ビューの用意
- Excel::downloadによるファイル出力処理
この方法を活用することで、管理画面や社内ツールでのレポート出力、ユーザー検索結果の保存など、さまざまな業務効率化に繋がります。自分のプロジェクトにもぜひ取り入れてみてください。
 
※参考にする場合は自己責任でお願いします。
 
											 
						
						
						
												 
						
						
						
												 
						
						
						
												 
						
						
						
												 
										
					