PHP⾼效导⼊导出Excel(csv)⽅法之fgetcsv()和
fputcsv()函数
CSV,是Comma Separated Value(逗号分隔值)的英⽂缩写,通常都是纯⽂本⽂件。
fgetcsv() 函数从⽂件指针中读⼊⼀⾏并解析 CSV 字段。
与 fgets 类似,不同的是 fgetcsv() 解析读⼊的⾏并出 CSV 格式的字段,然后返回⼀个包含这些字段的数组。
fgetcsv() 出错时返回 FALSE,包括碰到⽂件结束时。
具体使⽤时封装函数如下:
/**
* 导⼊Excel数据表格
* @param  string  $fileName  ⽂件名
* @param  int    $line      读取⼏⾏,默认全部读取
* @param  int    $offset    从第⼏⾏开始读,默认从第⼀⾏读取
* @return bool|array
*/
public function importCsv($fileName, $line=0, $offset=0){
//set_time_limit(0);//防⽌超时
//ini_set("memory_limit", "512M");//防⽌内存溢出
$handle = fopen($fileName,'r');
if(!$handle){
return  '⽂件打开失败';
}
fopen函数失败
$i = 0;
$j = 0;
$arr = [];
while($data = fgetcsv($handle)){
//⼩于偏移量则不读取,但$i仍然需要⾃增
if($i < $offset && $offset){
$i++;
continue;
}
//⼤于读取⾏数则退出
if($i > $line && $line){
break;
}
foreach ($data as$key => $value) {
$content = iconv("gbk","utf-8//IGNORE",$value);//转化编码
$arr[$j][] = $content;
}
$i++;
$j++;
}
return$arr;
}
前⾔:Excel表格最⾼⽀持104W⾏,导出数据达到上万的量,PHPExcel就显得有点⽆⼒了,经常卡死或者内存溢出,若做普通的数据导出功能,建议使⽤fputcsv()函数,因为此函数要⽐PHPexcel要⾼效的多,⼆⼗万数据导出⼤概需要2到3秒。
fputcsv() 函数将⾏格式化为 CSV 并写⼊⼀个打开的⽂件。
该函数返回写⼊字符串的长度。若出错,则返回 false。
具体使⽤时封装函数如下:
(注意点:
参数:$exportUrl分两种情况,根据需求选择其⼀
1.$exportUrl = 'php://output' 表⽰表⽰直接输出到浏览器⾃动下载。
* 导出Excel数据表格
* @param  array    $dataList    要导出的数组格式的数据
* @param  array    $headList    导出的Excel数据第⼀列表头
* @param  string  $fileName    输出Excel表格⽂件名
* @param  string  $exportUrl    直接输出到浏览器or输出到指定路径⽂件下
* @return bool|false|string
*/
public static function toExcel($dataList,$headList,$fileName,$exportUrl){
//set_time_limit(0);//防⽌超时
//ini_set("memory_limit", "512M");//防⽌内存溢出
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="'.$fileName.'.csv"');
header('Cache-Control: max-age=0');
//打开PHP⽂件句柄,php://output 表⽰直接输出到浏览器,$exportUrl表⽰输出到指定路径⽂件下$fp = fopen($exportUrl, 'a');
//输出Excel列名信息
foreach ($headList as$key => $value) {
//CSV的Excel⽀持GBK编码,⼀定要转换,否则乱码
$headList[$key] = iconv('utf-8', 'gbk', $value);
}
//将数据通过fputcsv写到⽂件句柄
fputcsv($fp, $headList);
//计数器
$num = 0;
//每隔$limit⾏,刷新⼀下输出buffer,不要太⼤,也不要太⼩
$limit = 100000;
//逐⾏取出数据,不浪费内存
$count = count($dataList);
for ($i = 0; $i < $count; $i++) {
$num++;
//刷新⼀下输出buffer,防⽌由于数据过多造成问题
if ($limit == $num) {
ob_flush();
flush();
$num = 0;
}
$row = $dataList[$i];
foreach ($row as$key => $value) {
$row[$key] = iconv('utf-8', 'gbk', $value);
}
fputcsv($fp, $row);
}
return$fileName;
}
另:导出csv数据Demo如下,可供参考:
<?php
$headList = ['id', '姓名', '年龄'];
$dataList = [[1, 'zhangsan', 10], [2, 'lisi', 20]];
toExcel($dataList, $headList, '测试⽂件名称', 'php://output');
浏览器请求,结果⽂件数据如下:
Loading [MathJax]/jax/output/HTML-CSS/jax.js