## 导出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);
```