1、先将百万级别的excel 数据按每行读取,每读取一行记录一条,将其存储在yield生成器中,不占用内存,读一条取一条。
public static function actionExcelData()
{
set_time_limit(0);
ini_set("memory_limit", "1024M");
$excelInfo['path'] = '/file/456.xlsx';
$inputFileType = IOFactory::identify($excelInfo['path']);
$objReader = IOFactory::createReader($inputFileType);
$worksheetNames = $objReader->listWorksheetNames($excelInfo['path']);
#只读取表格数据,忽略里面的各种格式,否则会内存耗尽
$objReader->setReadDataOnly(TRUE);
$objReader->setLoadSheetsOnly($worksheetNames[0]);#笔者此处加载第11个sheet
$objPHPExcels = $objReader->load($excelInfo['path']);
$maxCol = $objPHPExcels->getSheet(0)->getHighestColumn();#总列数
$maxCol = 'I';
$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。