2015-04-10 4 views
1

Я использую PHPExcel для создания файлов excel с использованием php. Сначала рассмотрим ниже код, проблема с этим кодом: после сохранения некоторого количества данных в excel он остается в процессе, но ничего не сохраняет. Я думаю, что сценарий сохраняет любые данные для улавливания и временных значений, и это заставляет сценарий получать все больше и больше нагрузки после каждой итерации. Пояснение:php Script занимает больше времени после каждой итерации

Прежде всего, этот код извлекает некоторые целочисленные значения из одного файла excel по одному, а именно. sample.xls (эти файлы содержат значения только в столбце A.). предположим, что он получил первое значение из ячейки A1 1212, тогда код устанавливает $ target = 1212, после того как функции curl извлекают данные для 1212 и сохраняют как html в папке с результатами как 1212.html. После того, как библиотека dom начинает свою работу. файл 1212.html содержит таблицу с тремя столбцами и так много строк. поэтому dom захватывает данные для td и tr и сохраняет соответствующие значения в ячейке excel и, наконец, сохраняет данные в папку excelresult как 1212.xlsx, и снова тот же самый процесс, выполненный для ячейки A2 в sample.xls, извлекает некоторые значения, такие как 1213, и начинает захватывать и так далее.

Проблема:

Вот это занимает мало времени для первого значения, как 1212, то занимает немного больше времени для второго значения 1213 и немного больше, и после четырех или пяти значений она занимает так много времени (много минут) времени для выполнения, пожалуйста, помогите мне уменьшить это время и ускорить этот процесс. Благодарю.

код:

<?php 
...... 
ini_set('include_path', ini_get('include_path').';../Classes/'); 
include_once 'PHPExcel.php'; 
include_once 'Excel2007.php'; 

$objPHPExcel = new PHPExcel(); 

$objPHPExcel->getProperties()->....//set some properties// 
$excel->read('sample.xls'); // added excel reader from which we need to take some values 
     $x=1; 
     while($x<=$excel->sheets[0]['numRows']) { // reading row by row 
      $y=1; 
      while($y<=$excel->sheets[0]['numCols']) {// reading column by column 
      $cell = isset($excel->sheets[0]['cells'][$x][$y]) ? $excel->sheets[0]['cells'][$x][$y] : ''; 
      $target = $cell; 


// $objWorksheet = $objPHPExcel->getActiveSheet(); 
      // $highestRow = $objWorksheet->getHighestRow(); 
      // for($row=1; $row < $highestRow; ++$row){ 
    // $objPHPExcel->getActiveSheet()->removeRow($row,$row); 
     // } 
/* some lines of code using curl to fetch data for $target value 
........... */ 
//below is the code which retrives data from html table and saves into excel file. 
$url='results/'.$target.'.html'; 
include_once('dom.php'); 

$html=file_get_html($url); 

    $record_find='first'; 

    foreach($html->find('table#GridView1') as $e){ 

       if($record_find=='first') 

       $i=1; 
       $j=0; 

       foreach($e->find('tr') as $e1){ 

           $distno=trim($e1->find('td', 0)->innertext); 
           $acno=trim($e1->find('td', 1)->innertext); 
           $partno=trim($e1->find('td', 2)->innertext); 
       $objPHPExcel->setActiveSheetIndex(0); 
           $objPHPExcel->getActiveSheet()->SetCellValue('A'.$j, $distno); 
           $objPHPExcel->getActiveSheet()->SetCellValue('B'.$j, $acno); 
           $objPHPExcel->getActiveSheet()->SetCellValue('C'.$j, $partno); 

           $j++; 
       } 
    } 

$objPHPExcel->getActiveSheet()->setTitle($target); 

$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel); 
$objWriter->save('excelresult/'.$target.'.xlsx'); 

$y++; 
      } 
      $x++; 
     } 
?> 

Curl:

$debug = 1; 
$url = "url"; 
$f = fopen('log.txt', 'w'); 
$cookies = 'cookies.txt'; 
touch($cookies); 
$useragent = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/36.0.1985.125 Chrome/36.0.1985.125 Safari/537.36'; 


$ch = curl_init($url); 
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookies); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_USERAGENT, $useragent); 

$html = curl_exec($ch); 

curl_close($ch); 

preg_match('~<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="(.*?)" />~', $html, $viewstate); 
preg_match('~<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="(.*?)" />~', $html, $eventValidation); 

$viewstate = $viewstate[1]; 
$eventValidation = $eventValidation[1]; 

$ch = curl_init(); 

curl_setopt($ch, CURLOPT_URL, $url); 
//curl_setopt($ch, CURLOPT_HEADER, true); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookies); 
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookies); 
curl_setopt($ch, CURLOPT_VERBOSE, 1); 
curl_setopt($ch, CURLOPT_STDERR, $f); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 0); 
curl_setopt($ch, CURLOPT_TIMEOUT, 985000); 
curl_setopt($ch, CURLOPT_USERAGENT, $useragent); 

// Collecting all POST fields 
$postfields = array(); 
$postfields['__EVENTTARGET'] = ""; 
$postfields['__EVENTARGUMENT'] = ""; 
$postfields['__LASTFOCUS'] = ""; 
$postfields['__VIEWSTATE'] = $viewstate; 
$postfields['__EVENTVALIDATION'] = $eventValidation; 
$postfields['cns_fer'] = 2; 
$postfields['xttPd'] = $target; 
$postfields['tsfDes'] = "Search"; 

curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields); 
$ret = curl_exec($ch); 
curl_close($ch); 
file_put_contents('results/'.$target.'.html', $ret); 

ответ

0

Что-то вроде:

for($row=1; $row < $highestRow; ++$row){ 
    $objPHPExcel->getActiveSheet()->removeRow($row,$row); 
} 

собирается занять много времени с каждой итерации, и большинство из них увольняемых скважина ....

Если вам необходимо удалить все данные из существующего листа используйте

$objPHPExcel->getActiveSheet()->removeRow(1,$highestRow); 

вместо этого, нет необходимости в цикл (особенно паразитного зацикливание удаления того, что уже было удалены много раз), удалите все в одном вызове

Я также озадачен тем, почему вы используете одну библиотеку для чтения файлов (excel Reader), а другую для написания (PHPExcel), когда вы можете использовать одну библиотеку (PHPExcel) для обеих целей ... хотя вы, кажется, делая очень мало с excel Reader, потому что вы повторяете каждую ячейку в этой таблице и не делаете ничего с ней вообще

EDIT

Что я имел в виду, что последний комментарий был что-то вроде:

<?php 
...... 
ini_set('include_path', ini_get('include_path').';../Classes/'); 
include_once 'PHPExcel.php'; 
include_once 'Excel2007.php'; 

$excel->read('sample.xls'); // added excel reader from which we need to take some values 

$x=1; 
while($x<=$excel->sheets[0]['numRows']) { // reading row by row 
    $y=1; 
    while($y<=$excel->sheets[0]['numCols']) {// reading column by column 
     $cell = isset($excel->sheets[0]['cells'][$x][$y]) ? $excel->sheets[0]['cells'][$x][$y] : ''; 
     $target = $cell; 

     /* some lines of code using curl to fetch data for $target value 
      ........... */ 
     //below is the code which retrives data from html table and saves into excel file. 
     $url='results/'.$target.'.html'; 
     include_once('dom.php'); 

     $html=file_get_html($url); 

     $objPHPExcel = new PHPExcel(); 
     $objPHPExcel->getProperties()->....//set some properties// 

     $record_find='first'; 

     foreach($html->find('table#GridView1') as $e){ 
      if($record_find=='first') 
       $i=1; 
      $j=0; 

      foreach($e->find('tr') as $e1){ 
       $distno=trim($e1->find('td', 0)->innertext); 
       $acno=trim($e1->find('td', 1)->innertext); 
       $partno=trim($e1->find('td', 2)->innertext); 
       $objPHPExcel->setActiveSheetIndex(0); 
       $objPHPExcel->getActiveSheet()->SetCellValue('A'.$j, $distno); 
       $objPHPExcel->getActiveSheet()->SetCellValue('B'.$j, $acno); 
       $objPHPExcel->getActiveSheet()->SetCellValue('C'.$j, $partno); 

       $j++; 
      } 
     } 

     $objPHPExcel->getActiveSheet()->setTitle($target); 

     $objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel); 
     $objWriter->save('excelresult/'.$target.'.xlsx'); 

     $objPHPExcel->disconnectWorksheets(); 
     unset($objPHPExcel); 

     $y++; 
    } 
    $x++; 
} 
?> 
+0

Спасибо за ваш ответ, я попытался выше, а также очень быстро, но вот последние данные также входит в новый файл , Например, первая итерация берет некоторые данные и сохраняет их до одного excel, после чего на следующей итерации он принимает новые данные, а также прошлые данные и сохраняет следующий файл excel. Пожалуйста, помогите мне. – RadhaComEng

+0

Ну что ж, вместо того, чтобы использовать один и тот же объект PHPExcel для каждой сохраненной книги, а это значит, что вам нужно стереть его, когда вы устанавливаете новые данные перед каждым запросом на завивки, почему бы не создать новый объект PHPExcel для каждого запроса на завивание? –

+0

ОК, позвольте мне попробовать. – RadhaComEng

Смежные вопросы