名站导航为爱好php程序的朋友们提供php相关的教程知识。
PhP程序Excel如何读取超大excel文件,有需要的朋友可以参考下。
工作中经常要遇到将xlsx文件中的部分内容导入到数据库。通常我们都是用PhP程序Excel来读取。
通过下面的方法我们可以很容易将一个excel表格读取成为php数组,之后就可以为所欲为了:
$input_file="data.xlsx";
$objPhP程序Excel=PhP程序Excel_IOFactory::load($input_file);
$sheetData=$objPhP程序Excel->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";
$objPhP程序Excel=PhP程序Excel_IOFactory::load($input_file);
$sheetData=$objPhP程序Excel->getSheet(0)->toArray(null,true,true,true);
但很负责任的说,这些都不是终极的方案。
我曾经试过将内存设置到了2G,超时设置到了90秒,也仍然读不出一个4000行的花花绿绿的表格。原因都出在toArray这个方法上,它会将处理的结果全保存到数组中,这种方式在处理简单表格时还是很方便的,但在处理大表格时,真的是很杯具。
我们的解决方案如下:
require'lib/PhP程序Excel.php'; set_time_limit(90); $input_file="data.xlsx"; $objPhP程序Excel=PhP程序Excel_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=$objPhP程序Excel->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/PhP程序Excel.php'; set_time_limit(90); $input_file="data.xlsx"; $objPhP程序Excel=PhP程序Excel_IOFactory::load($input_file); $sheet_count=$objPhP程序Excel->getSheetCount(); for($s=0;$s<$sheet_count;$s ) { $currentSheet=$objPhP程序Excel->getSheet($s);//当前页 $row_num=$currentSheet->gethighestRow();//当前页行数www.mzdh.net $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导入,当然也可以直接连接数据库向表中插入记录,这就随意了。
用这种方法可以将上万行的记录很轻松的导入到表中,希望对大家有所帮助。
好了关于php程序的知识就说到这里希望可以帮助需要的朋友。,解决nginx php弹出下载、不解析的问题