PHPでは特別なライブラリなどを追加でインストールしなくても、標準関数でCSVなどのファイルをエクスポートできます。
エクスポートができるということは、サイトが設置してあるWebサーバーからもファイルをダウンロードできるということなので、今回はその方法を残していきます。
サンプルコード
CSVファイルをエクスポートするためのサンプルコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?php $csv = fopen('php://temp', 'w'); fputcsv($csv, array('itemA', 'itemB', 'itemC')); $count = 30; while ($count > 0) { fputcsv($csv, array($count, $count*100, $count*10000)); $count--; } header('Content-type: application/csv'); header('Content-disposition: attachment; filename=items.csv'); rewind($csv); echo mb_convert_encoding(str_replace("\n", "\r\n", stream_get_contents($csv)), 'SJIS-win', 'UTF-8'); ?> |
このコードをサーバーで実行すると勝手にitems.csvというファイルがダウンロードされると思います。
これをMacのNumbersなどで開いてみるとこんな感じになります。
またエクセルで開いてもしっかりと表示されていることが分かります。
コードの解説
続いてはコードの解説をしていきます。
1 2 3 |
$csv = fopen('php://temp', 'w'); |
冒頭ではfopen()でphp://tempを開いています。
php://tempは読み書き可能なストリームで、一時データをファイルのように保存できるラッパーです。
このラッパーに対してCSVとして書き出したいデータを書き込んでいくわけですが、その部分がこちらになります。
1 2 3 4 5 6 7 8 9 |
fputcsv($csv, array('itemA', 'itemB', 'itemC')); $count = 30; while ($count > 0) { fputcsv($csv, array($count, $count*100, $count*10000)); $count--; } |
最初のarray(‘itemA’と’itemB’と’itemC’)でCSVファイルのヘッダーとなる部分を書き出しています。
そのあとのwhile文でデータを書き出しています。
1 2 3 4 5 6 |
header('Content-type: application/csv'); header('Content-disposition: attachment; filename=items.csv'); rewind($csv); echo mb_convert_encoding(str_replace("\n", "\r\n", stream_get_contents($csv)), 'SJIS-win', 'UTF-8'); |
最後の部分では、まずHTMLヘッダーを出力しています。これがないとブラウザがサーバーから何のデータを取ってきたのか理解することができなくなるので忘れずに付けましょう。
rewind()関数は、指定したファイルのファイルポインタを先頭に移動します。
ファイルポインタを先頭に戻したあとに、php://tempに書き込んだデータの改行コード(‘\n’)を変換して、エンコードをUTF-8からSJIS-winに変換し、echo()で出力します。