场景,在很多情况下,需要读取Excel文件。
常用的有PHPExcel包或者使用 maatwebsite/excel 包
但是使用这个包读取或生成excel,如果excel文件过大,很容易出现超内存情况。
解决方法:
上传:要求上传者使用.csv 文件上传。然后使用php自带的 fgetcsv()函数来读取文件。http://php.net/manual/zh/function.fgetcsv.php
demo:
**
* 读取excel
* @param string $filename
*/
public function fgetcsv(){
$row = 1;
if (($handle = fopen("test.csv", "r")) !== FALSE) {
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
$num = count($data);
echo "<p> $num fields in line $row: <br /></p>\n";
$row++;
for ($c=0; $c < $num; $c++) {
echo $data[$c] . "<br />\n";
}
}
fclose($handle);
}
}
生产csv文件:
**
* 告诉浏览器下载csv文件
* @param string $filename
*/
public function download($filename)
{
header("Conten-type:text/csv;charset=utf-8");
$list = array (
array('aaa', 'bbb', 'ccc', 'dddd'),
array('123', '456', '789'),
array('"aaa"', '"bbb"')
);
$fp = fopen('file.csv', 'w');
foreach ($list as $fields) {
fputcsv($fp, $fields);
}
fclose($fp);
}
实际测试效果,可以导出几百兆的csv格式的Excel、读取的话,没测试,感觉从文件指针中读入一行并解析 CSV 字段这种方式应该也可以读取很大的文件。。
误区Tip:
最开始我获取文件使用file_get_content() 函数,最后有个问题,如果单元格里面如果同时也有逗号,或者引号。当使用逗号去分割每行里面每个单元格,读取的数据就会有错。。。
按照上例子,解决问题!