## 導出CSV文件
在做系統的時候,經常會遇到需要導出excel的情況,但是由于phpExcel占用內存較高,導出大量數據時實在太慢,所以退而求其次的選擇以CSV格式來導出數據。
### 功能簡述
1. 代碼以工具類的格式展示
2. 傳入表頭和數據,自動拼裝并且生成CSV文件提供下載
### 知識點
1. **響應頭** - 由于Excel只支持GBK編碼,所以需要聲明導出內容的編碼;由于是以文件的格式輸出,所以要生成文件名稱。
2. **文件流** - 因為要輸出文件流,所以會用到相關的內容
3. **編碼轉換** - 數據的編碼是UTF-8,需要轉換成GBK
### 實現代碼
```
<?php
class csvUtil
{
/**
* csv文件輸出方法
* @param array $header 表頭
* @param array $funcName 數據
*/
static function output($head, $data)
{
// 超時設置
set_time_limit(60);
// 頭文件
header("Content-type: text/html; charset=gbk"); // 特別說明:excel需要支持中文的時候要將輸出內容的編碼轉為gbk
header('Content-Disposition: attachment;filename="文件名.csv"');
header('Cache-Control: max-age=0');
// 開啟文件流
$fp = fopen('php://output', 'a');
// 輸出Excel列頭信息
foreach ($head as $i => $v) {
// 編碼轉換
$head[$i] = iconv('utf-8', 'gbk', $v);
}
// 寫入列頭
fputcsv($fp, $head);
// 統計行數,減去1,得出數據最大下標,用于數組循環完之后輸出緩存
$maxIndex = count($data);
// 這邊只是簡單的數據讀取,這里還可以優化
foreach ($data as $k => $v) {
// 轉碼并寫入csv
foreach ($v as $i => $j) {
// 這里對數字做了特殊處理
$v[$i] = is_numeric($j) ? $j . "\t" : iconv('utf-8', 'gbk', $j);
}
// 寫入行數據
fputcsv($fp, $v);
// 每1000條數據輸出一次緩存
if (($k != 0 && $k % 1000 == 0) || $k == $maxIndex) {
ob_flush();
flush();
}
}
}
}
```
### 使用案例
```
$data = [];
$i = 10000;
while ($i > 0) {
$data[] = array('內容' . $i . '1', '內容' . $i . '2', '內容' . $i . '3');
$i--;
}
csvUtil::output(array('字段1', '字段2', '字段3'), $data);
```