バックエンド

【PHP】【Laravel】CSVエクスポートの方法〜5つのポイント〜

ちょっと前にPHPでCSVインポートをする方法を書きまして。

今回はCSVエクスポート(ダウンロード)の方法をまるっとまとめたいと思います。

Sponsored link

PHPでCSVエクスポートをするコード[laravel]

コントローラーのコードはこんな感じです。

大事な箇所を解説してみます。

PHPでCSVエクスポートの方法 ポイント1 response->stream

『laravel』でCSVエクスポートする方法をググっていたら、
こんなコメントを見つけたんですね。

CJxD
Newer versions of Laravel removed the Response::stream() function. Instead, use response()->stream($callback, 200, $headers); –
CJxD
直訳:新しいバージョンのlaravelはResponse::stream() を消したので、代わりにresponse()->stream($callback, 200, $headers);を使うといいよ。

参照記事:CSV export in laravel 5 controller

アオキ
そうなんや、ならさっそく取り入れてみよ。

と取り入れつつ、いくつかググって実現できました。

return response()->stream($callback, 200, $headers);

streamの中に、
コールバック(関数、今回はCSVエクスポートする処理)と、
ヘッダ情報を指定しています。

まずはヘッダから。

Sponsored link

PHPでCSVエクスポートの方法 ポイント2 HTTPヘッダ

インターネットを通じてやりとりする時は必ず、

『HTTP(エイチティーティーピー)』というルールにしたがう必要があります。

HTTP・・Hyper Text Transfer Protocol(ハイパーテキストトランスファープロトコル)

『プロトコル』というのが協定とか、決まりみたいな意味です。

で、

HTTPというルールでは必ず、『HTTPヘッダ』をつける決まりになってます。

このページがどんな種類で、どんな設定になってて・・

といった情報をまとめたのが、『HTTPヘッダ』になります。

今回の『HTTPヘッダ』はこんな感じです。

『キャッシュ』・・一度開いたWebページのデータを保存して、次回アクセス時にさくっと表示できる仕組み

『キャッシュ』を保存するようにすると、
次回アクセス時に読み込むスピードが早くなったりするメリットはあるんですが、
CSVエクスポートに関して言えば、キャッシュは保存しなくていいのかなと思います。

参考記事
『Webを支える技術』 第9章 HTTPヘッダ まとめメモ

次に、return response()->stream($callback, 200, $headers);

の中の、$callback の中で書かれている処理のポイントを。

PHPでCSVエクスポートの方法 ポイント3 お決まりの関数達

「PHP CSV エクスポート」でググるとかなりのサイトで
これらの関数が使われています。

ファイル開いて、
データ追記して、
ファイル閉じて。

アオキ
ここはセットで覚えておくといいんでしょうね。
Sponsored link

PHPでCSVエクスポートの方法 ポイント4 文字化け対策

文字化けに関しては、

WindowsとMacで設定が違うんですが、今回はWindowsを対象に。

WindowsでCSVを開く時はエクセルを使うことが多く、

エクセルは文字コードが『SJIS(エスジス)』になっているので、『SJIS』に合わせないと文字化けしてしまいます。

PHPでは mb_convert_variables という関数を使って文字コードを変更できるので、

1行ずつ文字コードを『UTF-8』から『SJIS』に変更するようにしています。

PHPでCSVエクスポートの方法 ポイント5 forechで繰り返す

データベースからデータを取得して、
foreachで1行ずつCSVファイルに追記していきます。

100行なら100回。
1000行なら1000回繰り返します。

データベースのデータをとってくる際は『オブジェクト型』になっているので -> で指定する必要あります。

参考記事

これらを踏まえてもう一回コードを。

アオキ
一行一行全部意味があるんですよねぇ、プログラミングって奥が深い・・
Sponsored link

さいごに

仕事で使うWEBサイトやWEBページでは、

必ずと言っていいほど『CSVエクスポート(ダウンロード)』の要望があります。

CSV機能ほしい人
え?なんでCSVでダウンロードできないの?

的な。

そんな時のために、

  1. responseとstream
  2. ヘッダ情報追加する
  3. よく使う関数(fopen, fputcsv, fclose)を知っておく
  4. 文字化け対策
  5. foreachで回す

といった流れをざっくりでも把握しておくと、いざって時にさくっと作れるかもですね。

アオキ
CSVなんだかんだ便利なんですよねー、エクセルでも加工しやすいし、資料とかつくりやすいし。

参考記事

laravel5.3 CSVダウンロードを実装する(あしたからがんばるさん)

Laravel5.4で、CSVダウンロード(一言多いプログラマーの独り言)

追記 2019/1/22
Laravel5.5にアップデート後 実行したらなぜかエラー。

いくつかぐぐると、config/database.php 内の strict が true になっていることが原因のようで、

falseに変更するとOKになりました。

いずれ原因解明したいところです。
QueryBuilderでgroupByをするとSyntax error or access violationがでる件

『PHP(Laravel)』ではこんな記事も読まれています。

1. 【Laravel(PHP)】初心者向け アプリのつくり方 をリリースしました【techpit】

2. 【PHP】【Laravel】CSVエクスポートの方法〜5つのポイント〜

3. 【PHP】オブジェクトと連想配列の違いについて調べてみた【初心者向け】

4. 【PHP】CSVインポートの方法〜大量データもバルクインサートでバッチリ!〜【laravel】

5. 【PHP】【図解】クラスと抽象クラスとインターフェースとトレイトとDIをまとめてみた【初心者向け】

6. 【PHP】配列や連想配列が覚えづらかったので学校に例えてみた【初心者向け】

7. 【PHP】ホームページに天気予報を表示させる方法【Webスクレイピング】【初心者向け】

8. 【Laravel5.5】Webアプリケーションを作るためのゆるめの環境構築編【Node.js】【npm】【Vue.js】【初心者向け】

9. 【PHP】2次元(多次元)配列でデータ取得したいならarray_columnがめっさ便利

コメント

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

CAPTCHA


関連記事

  1. バックエンド

    モナコイン騒動は結果的にプラスに。仮想通貨が一般層に拡がる要因について考えてみた。

    仮想通貨関連の最新ニュースを追っかけようと、ツイッターに目を凝らしてい…

  2. バックエンド

    【厳選8冊】ホームページを作れるようになるためのおすすめ本【初心者向け】

    先日とあるコミュニティで質問があがりまして。教えたがり性分の身…

  3. バックエンド

    【Laravel】ダミー(テスト)データを作る方法 シーダー(seeder)とfactoryとfak…

    『PHPの現場』というポッドキャストの放送で、ひときわ印象に残…

  4. バックエンド

    【Vue.js/Laravel】Webアプリ実践記 37歳おっさんが独学でVue.js+Larave…

    本業Webマーケッターと育児をしながら独学でwebアプリをつくってみる…

  5. バックエンド

    ビットフライヤーからビットコインウォレットにビットコインキャッシュを送金してみる

    最近なにやらビットコインキャッシュ(BCH)周りがざわざわしております…

  6. バックエンド

    【2段階認証】とは? 知っておきたい『セキュリティ』のはなし【初心者向け】

    『テクノロジー』が進化して、便利になればなるほどに、避けては通れな…

Sponsored link

最近の記事

  1. 数学

    【微分】とは わかりやすくまとめてみた〜めっちゃすごいわり算【初心者向け】
  2. 学び・教育

    『ニュータイプの時代』〜リベラルアーツとテクノロジーの融合〜
  3. 学び・教育

    『プログラミング教育』より大事な事を考えてみる~AI時代を見据えて~
  4. CG関連

    【WebGL】入門 わかりやすく【図解】してみた
  5. 数学

    【三角関数】の使い方〜わかりやすさ重視でまとめてみた【動画あり】
PAGE TOP
//記事ページのみに構造化データを出力 //サムネイルを取得 //ここから構造化データの記述