前回の記事、そうだ、そうだ、Laravel Excelを使ってみよう(1)セットアップの続きです。
ヘッダ行を追加
前回出力したファイル storage/app/purchase_history.xlsx を見るとデータのみが出力されていて、各列が何を示すのか分かりません。ヘッダ行を追加して分かりやすくします。WithHeadingsインタフェースを追加し、以下のメソッドをExportクラスに追加します。WithHeadingsインタフェースの制約により、戻り値の型をarrayに指定する必要があるのでご注意を。
...
use Maatwebsite\Excel\Concerns\WithHeadings;
class PurchaseHistoryExport implements FromCollection, WithHeadings
{
/**
* @return array
*/
public function headings() :array
{
return [
'ID', '作成日', '更新日', 'user_id', '商品名', '単価', '数量'
];
}
...
再度tinkerから出力するとヘッダ行が追加されました。

こちら出力して気づいたのですが、「数量」列に空欄になっているセルがありますね。なんでしょう?tinkerで該当のレコードを確認してみます。
Psy Shell v0.10.6 (PHP 7.2.34 — cli) by Justin Hileman
>>> App\PurchaseHistory::find(7);
=> App\PurchaseHistory {#4090
id: 7,
created_at: "2021-03-15 09:45:05",
updated_at: "2021-03-15 09:45:05",
user_id: 42426926,
product_name: "provident",
price: 5352,
quantity: 0,
}
なるほど、quantity: 0になっている箇所が空欄になっているのですね。Laravel Excelではデフォルトでは0をエクスポートするとnull扱いされ空のセルとなります。0を0として出力したい場合はWithStrictNullComparisonインタフェースをimplementする必要があります。
...
use Maatwebsite\Excel\Concerns\WithStrictNullComparison;
class PurchaseHistoryExport implements FromCollection, WithHeadings, WithStrictNullComparison
{
...
再度エクスポートすると空欄だったセルに0が挿入されています
![]()
ここまででお気づきかもしれませんが、Laravel Excelの実装は基本的にインタフェース(公式ドキュメントではConcernと呼ばれている)を追加していきます。必要なものを必要な時にだけ、最小限の拡張で実装できるのでコードをシンプルに保つことができそうです。
行ごとの処理を追加
前項まではDBから取得したデータをそのまま出力していましたが、「更新日・単価・数量」は不要、代わりに「合計金額」を出力して欲しい、と依頼されたとします。行ごとの処理を追加して出力内容を修正してみましょう。(この程度であれば、collectionメソッド側でDBから取得する際のクエリを修正した方が効率的ですが、例の為に敢えて行ごとの処理として実装します。)
エクスポートする項目が変わるのでヘッダ行の設定を先に修正します。
public function headings() :array
{
return [
'ID', '作成日', 'user_id', '商品名', '合計金額',
];
}
次に、行ごとの処理を追加します。行ごとの処理はWithMappingインタフェースをimplementし、mapメソッドを追加して実装です。合計金額は単価 x 数量としました。
...
use Maatwebsite\Excel\Concerns\WithMapping;
class PurchaseHistoryExport implements FromCollection, WithHeadings, WithStrictNullComparison, WithMapping
{
...
/**
* @param PurchaseHistory $row
* @return array
*/
public function map($row) :array
{
return [
$row->id,
$row->created_at,
$row->user_id,
$row->product_name,
$row->price * $row->quantity, // 合計金額
];
}
...
エクスポートは以下になりました。
更に続きます。
メルマガ購読の申し込みはこちらから。
