如何上传到php一个240000+行的xlsx工作表?

时间:2013-09-30 13:25:46

标签: php excel

目前我在上传带有 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);

2 个答案:

答案 0 :(得分:0)

不要费心解除memory_limit,除非你希望你的整张纸在那里结束两次:作为一个字符串,以及simplexml表示。 PHPExcel非常适合较小的工作表,但默认情况下它处理大型数据集很糟糕(主要关注的是它很慢,次要的是它消耗了大量内存,你已经注意到了);

您有几个选择:

  1. 如果你真的真的想使用PHPExcel,当然你可以找出一些涉及它的解决方案,这里有一个可用:How to read large worksheets from large Excel files (27MB+) with PHPExcel? - 要小心,因为有一些注意事项
  2. 您可以将XLS文件保存为CSV,并使用fgetcsv内置函数 - 它快速闪存,只消耗尽可能多的内存,因为一行可以占用< / LI>
  3. 如果您遇到xlsx,那么嘿,它只是一个zip存档。您可以使用ZipArchive课程解压缩,然后使用XMLReader
  4. 阅读工作表的数据

    CSV方式将是最强大的方式

答案 1 :(得分:0)

正如Adam所说,PHPExcel不是为处理大型工作表而设计的。他们实现了不同的缓存策略以及一些优化所用内存量的选项,但这会严重影响性能。

如果您必须坚持使用XLSX,请查看Spout。它是一个开源库,可以读写XLSX文件,并针对规模进行了优化。

读取240000+行大约需要1-2分钟,并且需要不到10MB的内存!