怎样用PHPExcel载入超大型excel文档

loading... 工作中中常常要碰到将xlsx文档中的一部分內容导进到数据信息库。一般大家全是用PHPExcel来载入。
根据下边的方式大家能够非常容易将一个excel报表载入变成php数字能量数组,以后便可认为所欲以便:
$objPHPExcel = PHPExcel_IOFactory::load($input_file); $sheetData = $objPHPExcel- getSheet(0)- toArray(null, true, true, true); 很悲剧的状况一直存有的,当data.xlsx有过万行,每一行又有许多列,每一列又有较长的标识符串,而且有的也有色调等效电路果时,用上边的方式常常产生的状况便是运行内存不够。
行吧,大家也有ini_set来增加运行内存,还能够用set_time_limit来设定较长的请求超时,以下:


$objPHPExcel = PHPExcel_IOFactory::load($input_file); $sheetData = $objPHPExcel- getSheet(0)- toArray(null, true, true, true);
但很承担任的说,这种也不是最终的计划方案。
曾经的我用过将运行内存设定来到2G,请求超时设定来到90秒,也依然读出不来一个4000行的小编绿绿的报表。缘故都出在toArray这一方式上,它会将解决的結果全储存到数字能量数组中,这类方法在解决简易报表时還是很便捷的,但在解决大报表时,确实是很杯具。
大家的处理计划方案以下:


$sheet_read_arr[ sheet1 ] = array( A , B , C , D , F $sheet_read_arr[ sheet2 ] = array( A , B , C , D , F // 循环系统全部的页 foreach ($sheet_read_arr as $key = $val) $currentSheet = $objPHPExcel- getSheetByName($key);// 根据页名字获得当今页 $row_num = $currentSheet- getHighestRow();// 当今页行数 // 循环系统从第二行刚开始,第一行通常是表头 for ($i = 2; $i = $row_num; $i++) $cell_values = array(); foreach ($val as $cell_val) $address = $cell_val . $i;// 模块格座标 // 载入模块格內容 $cell_values[] = $currentSheet- getCell($address)- getFormattedValue(); // 看一下数据信息 print_r($cell_values); }
上边的方法算作较繁杂的状况了,假如仅仅想将全部的模块格全读取来,用下边的方式就可以了了:


$currentSheet = $objPHPExcel- getSheet($s);// 当今页 $row_num = $currentSheet- getHighestRow();// 当今页行数 $col_max = $currentSheet- getHighestColumn(); // 当今页较大列号 // 循环系统从第二行刚开始,第一行通常是表头 for($i = 2; $i = $row_num; $i++) $cell_values = array(); for($j = A $j $col_max; $j++) $address = $j . $i; // 模块格座标 $cell_values[] = $currentSheet- getCell($address)- getFormattedValue(); // 看一下数据信息 print_r($cell_values); }
大家能够将上边的print_r地区改为组拼sql句子并载入文档,随后用mysql导进,自然还可以立即联接数据信息库向表格中插进纪录,这就随便了。
用这类方式能够将过万行的纪录很轻轻松松的导进到表格中,期待对大伙儿有一定的协助。