csv和excel php 解析_PHP 高效导入导出Excel(csv)方法之fgetcsv()和fputcsv()函数

CSV,是Comma Separated Value(逗号分隔值)的英文缩写,通常都是纯文本文件。

一、CSV数据导入函数fgetcsv()

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 '文件打开失败';

}$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;

}

二、CSV数据导出函数fputcsv()

前言:Excel表格最高支持104W行,导出数据达到上万的量,PHPExcel就显得有点无力了,经常卡死或者内存溢出,若做普通的数据导出功能,建议使用fputcsv()函数,因为此函数要比PHPexcel要高效的多,二十万数据导出大概需要2到3秒。

fputcsv() 函数将行格式化为 CSV 并写入一个打开的文件。

该函数返回写入字符串的长度。若出错,则返回 false。

具体使用时封装函数如下:

(注意点:

参数:$exportUrl分两种情况,根据需求选择其一

1.$exportUrl = 'php://output' 表示表示直接输出到浏览器自动下载。

2.$exportUrl = "服务器目录地址/文件名.csv" 表示输出到指定路径文件下。举例:$exportUrl = "/data/a.csv")。

/**

* 导出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如下,可供参考:

toExcel($dataList, $headList, '测试文件名称', 'php://output');

浏览器请求,结果文件数据如下:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值