Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/253.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何将一份包含240000+;排?_Php_Excel - Fatal编程技术网

Php 如何将一份包含240000+;排?

Php 如何将一份包含240000+;排?,php,excel,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_strin

现在我上传一个包含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
警告:simplexml\u load\u string():内存分配失败:生成属性
在第625行的C:\xampp\htdocs\excelamysql\Classes\PHPExcel\Reader\Excel2007.php中
警告:simplexml\u load\u string():C:\xampp\htdocs\ex中的内存分配失败
第625行的celamysql\Classes\PHPExcel\Reader\Excel2007.php
警告:simplexml_load_string():实体:第2行:解析器错误:内存分配
on失败:C:\xampp\htdocs\excelamysql\Classes\PHPExcel\R\n中的XMLSAX2属性
第625行的eader\Excel2007.php
警告:simplexml_load_string():>4816149
4816149
setLoadSheetsOnly($sheetname);
$objPHPExcel=$objReader->load('C:\xampp\htdocs\excelamysql\Maestra.xlsx');
$worksheet=$objPHPExcel->setActiveSheetIndex(0);
foreach($worksheet->getRowIterator()作为$row)
{
$cellIterator=$row->getCellIterator();
$cellIterator->setiterateonleyexistingcells(TRUE);
foreach($cellIterator作为$cell)
{
$val=$cell->getValue();
$dataType=phpexcell\u Cell\u dataType::dataTypeForValue($val);
}
}
对于($row=2;$row getCellByColumnRow(12,$row));
$val[]=$cell->getValue();
$sql=“将ignore插入Estado(Id_est,nom_est)值(“'auto.”,“$val[0]”);
$link=mysql(“pago_coberturas”,$sql);
$sql2=“ALTER TABLE Estado AUTO_INCREMENT=1”;
$link2=mysql(“pago_coberturas”,$sql2);

不要费心取消
内存限制
,除非您希望整个工作表在其中结束两次:作为字符串和simplexml表示形式。PHPExcel非常适合于较小的工作表,但默认情况下,它在处理大数据集时很糟糕(主要关注的是它的速度慢,其次是它消耗了大量内存,正如您已经注意到的那样)

您有几个选择:

  • 如果您真的想使用PHPExcel,当然您可以找到一些涉及它的解决方案,这里有一个可用的解决方案:-要小心,因为这里有一些注意事项
  • 您可以将
    XLS
    文件另存为
    CSV
    ,并使用内置功能-它的速度非常快,并且只消耗一行所能占用的内存
  • 如果你坚持使用
    xlsx
    ,那么,嘿,这只是一个zip存档。你可以用class解压它,然后用class读取工作表的数据

  • CSV方式将是最稳健的方式

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

    如果你必须坚持使用XLSX,那就去看看吧。这是一个开源的库,可以读写XLSX文件,并针对规模进行了优化


    读取240000多行大约需要1-2分钟,所需内存少于10MB!

    在PHP.ini中配置PHP以允许更多内存使用。可能的重复您是否尝试过使用SQLYG并将XLSX直接从本地文件导入表中?您是否尝试过启用PHPExcel的单元缓存以减少内存使用?您是否尝试过ied在“块”中加载文件?
    $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);