企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
### PHPExcel如何读取超大excel文件,有需要的朋友可以参考下。 工作中经常要遇到将xlsx文件中的部分内容导入到数据库。通常我们都是用PHPExcel来读取。 通过下面的方法我们可以很容易将一个excel表格读取成为php数组,之后就可以为所欲为了: ~~~ $input_file="data.xlsx"; $objPHPExcel=PHPExcel_IOFactory::load($input_file); $sheetData=$objPHPExcel->getSheet(0)->toArray(null,true,true,true); ~~~ 如果文章到此结束,那价值就不大了。 很不幸的情况总是存在的,当data.xlsx有上万行,每一行又有很多列,每一列又有很长的字符串,并且有的还有颜色等效果时,用上面的方法经常发生的情况就是内存不足。 好吧,我们还有ini_set来加大内存,还可以用set_time_limit来设置较长的超时,如下: ~~~ set_time_limit(90); ini_set("memory_limit","1024M"); $input_file="data.xlsx"; $objPHPExcel=PHPExcel_IOFactory::load($input_file); $sheetData=$objPHPExcel->getSheet(0)->toArray(null,true,true,true); ~~~ 但很负责任的说,这些都不是终极的方案。 我曾经试过将内存设置到了2G,超时设置到了90秒,也仍然读不出一个4000行的花花绿绿的表格。原因都出在toArray这个方法上,它会将处理的结果全保存到数组中,这种方式在处理简单表格时还是很方便的,但在处理大表格时,真的是很杯具。 我们的解决方案如下: ~~~ require'lib/PHPExcel.php'; set_time_limit(90); $input_file="data.xlsx"; $objPHPExcel=PHPExcel_IOFactory::load($input_file); //读取规则 $sheet_read_arr=array(); $sheet_read_arr["sheet1"]=array("A","B","C","D","F"); $sheet_read_arr["sheet2"]=array("A","B","C","D","F"); //循环所有的页 foreach($sheet_read_arras$key=>$val) { $currentSheet=$objPHPExcel->getSheetByName($key);//通过页名称取得当前页 $row_num=$currentSheet->getHighestRow();//当前页行数 //循环从第二行开始,第一行往往是表头 for($i=2;$i<=$row_num;$i++) { $cell_values=array(); foreach($valas$cell_val) { $address=$cell_val.$i;//单元格坐标 //读取单元格内容 $cell_values[]=$currentSheet->getCell($address)->getFormattedValue(); } //看看数据 print_r($cell_values); } } ~~~ 上面的方式算是较复杂的情况了,如果只是想将所有的单元格全读出来,用下面的方法就行了: ~~~ require'lib/PHPExcel.php'; set_time_limit(90); $input_file="data.xlsx"; $objPHPExcel=PHPExcel_IOFactory::load($input_file); $sheet_count=$objPHPExcel->getSheetCount(); for($s=0;$s<$sheet_count;$s++) { $currentSheet=$objPHPExcel->getSheet($s);//当前页 $row_num=$currentSheet->getHighestRow();//当前页行数www.zzarea.com $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导入,当然也可以直接连接数据库向表中插入记录,这就随意了。 用这种方法可以将上万行的记录很轻松的导入到表中,希望对大家有所帮助。