PHPExcel 读取百万级、千万级Excel文件数据的方法,按每行读取数据,使用yield生成器技术

1、先将百万级别的excel 数据按每行读取,每读取一行记录一条,将其存储在yield生成器中,不占用内存,读一条取一条。


public static function getExcelData()
    {
    
    
        $excelInfo['path'] = 'D:\phpstudy_pro\WWW\api.321.design\Upload\excel\20201230\a795e09f355d48b018421f0f58c42814.xlsx';
        $inputFileType = \PHPExcel_IOFactory::identify($excelInfo['path']);
        $objReader = \PHPExcel_IOFactory::createReader($inputFileType);
        $worksheetNames = $objReader->listWorksheetNames($excelInfo['path']);

        #只读取表格数据,忽略里面的各种格式,否则会内存耗尽
        $objReader->setReadDataOnly(TRUE);
        $objReader->setLoadSheetsOnly($worksheetNames[11]);#笔者此处加载第11个sheet
        $objPHPExcels = $objReader->load($excelInfo['path']);
        $maxCol = $objPHPExcels->getSheet(0)->getHighestColumn();#总列数
        $maxRow = $objPHPExcels->getSheet(0)->getHighestRow();#总行数
        $a = 'A';
        for ($i = 1; $i <= $maxRow; $i++) {
    
    
            yield  $objPHPExcels->getSheet(0)->rangeToArray('A' . $i . ':' . $maxCol . $i)[0];#读取一行
            $a++;
        }
    }

2、遍历方法:

  $titleExcels = self::getExcelTitle();#可以把$titleExcels 当做一个千万级别的数组,按每行的值作为数组的一个value。

解释,在此处直接打印$titleExcels 会打印不出来的。要打印数组里面的值才行。
Generator Object
(
)
实际使用效果跟数组的遍历 foreach 相同。

3、对于小型表可以直接使用toArray()读取,前提是不怕崩的话。读取后是一个庞大的二维数组。

$excelInfo['path'] = 'D:\phpstudy_pro\WWW\api.321.design\Upload\excel\20201230\a795e09f355d48b018421f0f58c42814.xlsx';
$inputFileType = \PHPExcel_IOFactory::identify($excelInfo['path']);
$objReader = \PHPExcel_IOFactory::createReader($inputFileType);
$worksheetNames = $objReader->listWorksheetNames($excelInfo['path']);

#只读取表格数据,忽略里面的各种格式,否则会内存耗尽
$objReader->setReadDataOnly(TRUE);
$objReader->setLoadSheetsOnly($worksheetNames[11]);
$objPHPExcels = $objReader->load($excelInfo['path']);
$titleExcels = $objPHPExcels->getSheet(0)->toArray();

笔者使用的表是亚马逊模板表:
http://api.321.design/excel/20210119/c2ffb7cbae1c15f9ed45eb5d5c34a95d.xlsm

猜你喜欢

转载自blog.csdn.net/weixin_42433970/article/details/115120718