目前我在上传带有 240000 行的xlsx工作表时出错。
问题是代码无法正确读取文件。这是我从我的PHP代码的结果得到的。
Warning: simplexml_load_string(): Memory allocation failed : building attribute
in C:\xampp\htdocs\excelamysql\Classes\PHPExcel\Reader\Excel2007.php on line 625
Warning: simplexml_load_string(): Memory allocation failed in C:\xampp\htdocs\ex
celamysql\Classes\PHPExcel\Reader\Excel2007.php on line 625
Warning: simplexml_load_string(): Entity: line 2: parser error : Memory allocati
on failed : xmlSAX2AttributeNs in C:\xampp\htdocs\excelamysql\Classes\PHPExcel\R
eader\Excel2007.php on line 625
Warning: simplexml_load_string(): >48161</v></c><c r="B27695" s="10" t="s"><v>49
</v></c><c r="C27695" s="11" t="s" in C:\xampp\htdocs\excelamysql\Classes\PHPExc
el\Reader\Excel2007.php on line 625
Warning: simplexml_load_string():
^ in C:\xampp\htdocs\excelamysql\Classes\PHPExc
el\Reader\Excel2007.php on line 625
Warning: simplexml_load_string(): Entity: line 2: parser error : Extra content a
t the end of the document in C:\xampp\htdocs\excelamysql\Classes\PHPExcel\Reader
\Excel2007.php on line 625
Warning: simplexml_load_string(): >48161</v></c><c r="B27695" s="10" t="s"><v>49
</v></c><c r="C27695" s="11" t="s" in C:\xampp\htdocs\excelamysql\Classes\PHPExc
el\Reader\Excel2007.php on line 625
Warning: simplexml_load_string():
^ in C:\xampp\htdocs\excelamysql\Classes\PHPExc
el\Reader\Excel2007.php on line 625
这是一段php代码:
$objReader->setLoadSheetsOnly($sheetname);
$objPHPExcel = $objReader->load('C:\xampp\htdocs\excelamysql\Maestra.xlsx');
$worksheet = $objPHPExcel->setActiveSheetIndex(0);
foreach($worksheet->getRowIterator() as $row)
{
$cellIterator = $row->getCellIterator();
$cellIterator->setIterateOnlyExistingCells(TRUE);
foreach($cellIterator as $cell)
{
$val = $cell->getValue();
$dataType = PHPExcel_Cell_DataType::dataTypeForValue($val);
}
}
for ($row = 2; $row <= $highestRow; ++ $row)
{
$val=array();
$cell = $worksheet->getCellByColumnAndRow(12, $row);
$val[] = $cell->getValue();
$sql="insert ignore into Estado (Id_est,nom_est )values('".'auto'."','" . $val[0] . "')";
$link= mysql("pago_coberturas", $sql);
$sql2="ALTER TABLE Estado AUTO_INCREMENT = 1";
$link2= mysql("pago_coberturas",$sql2);
答案 0 :(得分:0)
不要费心解除memory_limit
,除非你希望你的整张纸在那里结束两次:作为一个字符串,以及simplexml表示。 PHPExcel非常适合较小的工作表,但默认情况下它处理大型数据集很糟糕(主要关注的是它很慢,次要的是它消耗了大量内存,你已经注意到了);
您有几个选择:
XLS
文件保存为CSV
,并使用fgetcsv内置函数 - 它快速闪存,只消耗尽可能多的内存,因为一行可以占用< / LI>
xlsx
,那么嘿,它只是一个zip存档。您可以使用ZipArchive课程解压缩,然后使用XMLReader CSV方式将是最强大的方式
答案 1 :(得分:0)
正如Adam所说,PHPExcel不是为处理大型工作表而设计的。他们实现了不同的缓存策略以及一些优化所用内存量的选项,但这会严重影响性能。
如果您必须坚持使用XLSX,请查看Spout。它是一个开源库,可以读写XLSX文件,并针对规模进行了优化。
读取240000+行大约需要1-2分钟,并且需要不到10MB的内存!