一、前言
本来是不打算写这篇的,但是网上复制几个demo
,多多少少都有问题,有的是不能读取AA,BB
开头的,有的是数据读取不全的,所以就改了一下,分享给大家,这个demo
能把我这7000
多行,110
多列的数据都读取出来,写入到数组。
下面是excel
的截图,能看出来还是比较大的文件:
二、读取demo以及比较
1、php读取exceldemo
/**
* @param $file
* @param array $params
* @return array
* @throws PHPExcel_Exception
* @throws PHPExcel_Reader_Exception
* @params:获取全部的excel数据,已经加上表头,是完整的获取了
* @author:ljf
* @date:2019/12/6
* @time:18:14
*/
function getData($file,$params = array())
{
$path = __DIR__.'/vendor/PHPExcel_1.8.0/PHPExcel.php';
require_once($path);
//获取文件类型
$file_suffix = pathinfo($file)['extension'];
//设置模板根据不同的excel版本
$excel_temple = array('xls'=>'Excel5','xlsx'=>'Excel2007');
$excelReader = \PHPExcel_IOFactory::createReader($excel_temple[$file_suffix]);//配置成2003版本,因为office版本可以向下兼容
$sheet = $excelReader->load($file)->getSheet(2); //sheet1操作
$excelCont = array(
'highestCol' => $sheet->getHighestColumn(), //列
'highestRow' => $sheet->getHighestRow(), //行
'highestColumnIndex' => PHPExcel_Cell::columnIndexFromString($sheet->getHighestColumn()) // 几列
);
$countCol = isset($params['count_col']) ? $params['count_col'] : $excelCont['highestColumnIndex'];//有效列的数目,读取时只取前$countCol列
$startRow = isset($params['need_head']) && $params['need_head'] ? 1 : 2;//从第1行开始读,读取表头
$rightArr = array();
//获取多少行
$row = $excelCont['highestRow'];
$emptyLine = 0;
for ($j = $startRow; $j < intval($row) + 1; $j++) {
$retArr = array();//该行的各个单元格的数据
$emptyCol = 0;
for($i = 0; $i < $countCol;$i++){//循环该行的单元格
$val = $sheet->getCellByColumnAndRow($i, 1)->getValue();//假设表头在第一行,所以仅获取第一行的所有列的信息
//根据获取的表头内容,存入到新数组中
$retArr[$val] = $sheet->getCellByColumnAndRow($i, $j)->getValue(); //根据坐标获取内容
$retArr[$val] = isset($retArr[$val]) ? trim($retArr[$val]) : $retArr[$val];
if($retArr[$val] === null){
$emptyCol++;
}
}
if($emptyCol == $countCol){//这行为空行,不放入任何数组
$emptyLine++;
}else {
$rightArr[] = $retArr;
}
}
unset($sheet);
if(empty($rightArr)){
$result = array(
'errcode' =>1004,
'errmsg' =>"上传文件内没有有效数据",
);
}else{
$result = array(
'errcode' =>0,
'errmsg' =>"",
'data' =>$rightArr,
);
}
return $result;
}
// 调用方法
$start = time();
$start1 = memory_get_usage();
$file = "./devices.xlsx";
//$result = _get_excel_metainfo($file);
$result = getData($file);
$end1 = memory_get_usage(true); //10k elements array;
$end = time();
var_dump(convert($end1)); //获取占用内存
var_dump($end - $start);
以上就是读取部分的代码,具体的逻辑看注释就行,大意就是引入phpexcel
类,然后通过这个类打开文件,获取列长度,行长度,然后循环给数组赋值。
在测试的时候,发现速度有点慢,因此这里打印了下耗时以及内存耗费:
php耗时以及占用内存:
string(6) "178 mb" int(13)
可以看到耗时13s
,内存也耗费不少。一直以来都听说phpexcel
性能不大好,这次算是彻底见识到了,13s
的读取时间在程序里面是不能接受的,如果一定要用php
读取的话,建议是选择异步调用的方式读取吧,最起码不阻塞进程不是。
异步轮询可以参考:php实现异步轮询
2、python读取这个excel文件
博主测试玩php
之后,感觉速度有点慢,所以又用python
的pandas
读取了一下,顺带测试下速度,读取代码大致如下:
pandas.DataFrame(pandas.read_excel('excel文件路径'))
耗时如下:
cost mem: 2850 占用内存大概3M
cost time: 2.47637677192688
不比不知道,一比吓一跳,python
耗时只需要2.5s
,内存占用也极小,这。。。
内存方面可能会因为php
没有及时释放一些变量加上赋值给数组造成内存比较大,python
的操作少一些,所以内存方面对比不准确,不过也能看出来确实是python
耗费内存更小一些。时间上就不提了,phpexcel
是比较辣鸡的。
3、php调用python代码
关于php如何调用python代码,这部分很多博主都写的有,博主这里就不多写了,大家有兴趣的话可以去百度下,此类文章很多。
注意:
这里调用python
用的方法是exec()
或者system()
,这两个函数其实危险性还是很高的,有些配置比较严谨的环境都会禁用掉着两个函数,大家在用之前,可以打开php.ini
,查询disable_functions
,看看被禁用的函数里面是否会有这两个函数。同时也要考虑好是否要用这两个函数,毕竟是比较危险的。
三、总结
不知道从什么时候开始,博主会在选择一个方案的时候对比其他的方案,就比如这里的对比php
和python
读取excel
的性能,不过对比是对比,我们要做的是稳中择优,而不是对比某个语言的好坏。有时候就很烦那些对比语言的,动不动就是xxx
语言就是垃圾,我觉得这种对比语言的人呐,水平也就那个样子了,编程语言只是工具,不是你装逼的背景。
尺有所长,寸有所短。前段时间和朋友讨论的时候,他说php
的优点就是敏捷开发,web
开发,这是php
擅长的地方,如果你非得拿php
不擅长的部分和其他语言擅长的部分去比较,结果肯定是会失望的。说来也是,现在的编程语言百花齐放,某种意义上还是因为各个语言的侧重点不同,如果真的有哪个语言各方面都很优秀,那么恐怕早就一统江湖了哈哈。
大家加油!
end