🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 导出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); ```