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