php读取excel文件demo以及与python的性能比较

一、前言

      本来是不打算写这篇的,但是网上复制几个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之后,感觉速度有点慢,所以又用pythonpandas读取了一下,顺带测试下速度,读取代码大致如下:

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代码,这部分很多博主都写的有,博主这里就不多写了,大家有兴趣的话可以去百度下,此类文章很多。

如何实现在PHP中调用Python并获取运行结果?

注意:

      这里调用python用的方法是exec()或者system(),这两个函数其实危险性还是很高的,有些配置比较严谨的环境都会禁用掉着两个函数,大家在用之前,可以打开php.ini,查询disable_functions,看看被禁用的函数里面是否会有这两个函数。同时也要考虑好是否要用这两个函数,毕竟是比较危险的。

三、总结

      不知道从什么时候开始,博主会在选择一个方案的时候对比其他的方案,就比如这里的对比phppython读取excel的性能,不过对比是对比,我们要做的是稳中择优,而不是对比某个语言的好坏。有时候就很烦那些对比语言的,动不动就是xxx语言就是垃圾,我觉得这种对比语言的人呐,水平也就那个样子了,编程语言只是工具,不是你装逼的背景。

马蜂窝裁php换java,php又又又凉凉了吗

      尺有所长,寸有所短。前段时间和朋友讨论的时候,他说php的优点就是敏捷开发,web开发,这是php擅长的地方,如果你非得拿php不擅长的部分和其他语言擅长的部分去比较,结果肯定是会失望的。说来也是,现在的编程语言百花齐放,某种意义上还是因为各个语言的侧重点不同,如果真的有哪个语言各方面都很优秀,那么恐怕早就一统江湖了哈哈。

大家加油!
end

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

铁柱同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值