0

现在我在上传包含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);
4

2 回答 2

0

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

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

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

于 2015-01-27T19:02:33.487 回答
0

不要费心解除memory_limit,除非您希望整个工作表最终出现两次:作为字符串和作为 simplexml 表示。PHPExcel 非常适合较小的工作表,但默认情况下它在处理大型数据集时很糟糕(主要问题是它很慢,其次是它会消耗大量内存,正如您已经注意到的那样);

你有几个选择:

  1. 如果您真的想使用 PHPExcel,当然您可以找到一些涉及它的解决方案,这里有一个可用的解决方案:如何使用 PHPExcel 从大型 Excel 文件 (27MB+) 中读取大型工作表?- 要小心,因为有一些警告
  2. 您可以将XLS文件另存为CSV,并使用fgetcsv内置函数 - 它速度极快,并且只消耗一行可以占用的内存
  3. 如果你被困住了xlsx,那么嘿,它只是一个 zip 存档。你可以用ZipArchive类解压它,然后用XMLReader读取工作表的数据

CSV 方式将是最稳健的方式

于 2013-09-30T13:38:08.760 回答