Перейти к содержимому

Реферальная программа Мегаплана


Чтение XLS на php

#1 Вячеслав

Вячеслав
  • Пользователь
  • 357 сообщений
  • Репутация: 0
0

Отправлено 09 Сентябрь 2016 - 15:36

Здравствуйте форумчане! Помогите понять почему не получается считать XLS файл в котором есть страницы, укаждую страницу отдельно циклом и при этом кажлую страницу по строчно?

За одну итерацию считывается 10 строк и данные из них, всего 46 страниц.

 

Сам файл пркрепил к посту

 

А это код скрипта, (использую библиотеку PHPExcel)

	function get_posts() {
		global $wpdb;

		set_time_limit(0);

		$x = 0;
		$sheetIndex = ($_GET['sheetIndex'])? $_GET['sheetIndex'] : 1; //номер стр
		$dataResSheet = array();
		$chunkSize = 10;		//размер считываемых строк за раз
		$startRow = 1;			//начинаем читать со строки 2, в PHPExcel первая строка имеет индекс 1, и как правило это строка заголовков
		$exit = false;			//флаг выхода
		$empty_value = 0;		//счетчик пустых знаений
		$arrMarkAuto = array('ACURA', 'ALFA ROMEO', 'AUDI', 'B.M.W', 'BUICK', 'CADILLAC', 'CHEVROLET', 'CHEVROLET TRUCK', 'CHRYSLER', 'CITROEN', 'DAEWOO', 'DAIHATSU', 'FIAT', 'FORD', 'FORD TRUCK', 'GMC TRUCK', 'HONDA', 'HYUNDAI', 'INFINITI', 'ISUZU', 'JAGUAR', 'JEEP', 'KIA', 'LADA', 'LAND ROVER', 'Lexus', 'LINCOLN', 'MAZDA', 'MERCEDES  BENZ', 'MINI', 'MITSUBISHI', 'NISSAN', 'OPEL', 'PEUGEOT', 'PORSCHE', 'RENAULT', 'SEAT', 'SKODA', 'SMART', 'SSANGYONG', 'SUBARU', 'SUZUKI', 'TATA', 'TOYOTA', 'VOLKSWAGEN', 'VOLVO');
		$arrMarkAutoSub = array('DAIHATSU (EUR)', 'FORD (USA)', 'HONDA (U.S.A.)', 'HONDA (EUR)', 'ISUZU (U.S.A)', 'ISUZU (EUR.)', 'MAZDA (U.S.A.)', 'MAZDA (EUR.)', 'MITSUBISH (U.S.A)', 'MITSUBISHI (EUR.)', 'NISSAN    (USA)', 'NISSAN    (EUR)', 'SEAT', 'SUBARU    (USA)', 'SUBARU    (EUR)', 'SUZUKI (U.S.A)', 'SUZUKI (EUR.)', 'TOYOTA (U.S.A.)', 'TOYOTA (EUR.)');
		$sheetname = ''; //название листа который следует прочесть
		

		if (!file_exists($this->file)) {
			exit();
		}
		include_once 'Classes/PHPExcel.php';

		$objReader = PHPExcel_IOFactory::createReaderForFile($this->file);
		$objReader->setReadDataOnly(true);

		$chunkFilter = new chunkReadFilter(); 
		$objReader->setReadFilter($chunkFilter); 

		//внешний цикл, пока файл не кончится
		for($x = $sheetIndex; $x < count($arrMarkAuto); $x++){

			$dataRes = array();

			do{

				$arrRow = array();
				$chunkFilter->setRows($startRow, $chunkSize); //устанавливаем знаечние фильтра
				$objPHPExcel = $objReader->load($this->file); //открываем файл
				$objPHPExcel->setActiveSheetIndex($sheetIndex); //устанавливаем индекс активной страницы (от 0 до n)
				//$objPHPExcel->setLoadSheetsOnly($sheetname); 
				$objWorksheet = $objPHPExcel->getActiveSheet();	//делаем активной нужную страницу
				for ($i = $startRow; $i < ($startRow + $chunkSize); $i++) //внутренний цикл по строкам
				{

					$value_0 = trim(htmlspecialchars($objWorksheet->getCellByColumnAndRow(0, $i)->getValue()));
					$value_1 = trim(htmlspecialchars($objWorksheet->getCellByColumnAndRow(1, $i)->getValue()));
					$value_2 = trim(htmlspecialchars($objWorksheet->getCellByColumnAndRow(2, $i)->getValue()));
					$value_3 = trim(htmlspecialchars($objWorksheet->getCellByColumnAndRow(3, $i)->getValue()));


					if(!strlen($value_0) && !strlen($value_1) && !strlen($value_2) && !strlen($value_3)){	//проверяем значение на пустоту
						$empty_value++;
					}else{
						$empty_value = 0;
					}

					if($empty_value >= 2)//после трех пустых значений, завершаем обработку файла, думая, что это конец
					{	
						$exit = true;
						$i = $startRow;
						continue;
					}else{
						//$worksheetTitle = $objWorksheet->getTitle();
						$arrRow[] = array(
							$value_0,
							$value_1,
							$value_2,
							$value_3
						);
					}
					/*Манипуляции с данными каким Вам угодно способом, в PHPExcel их превеликое множество*/

				}

				$dataRes[] = $arrRow;

				unset($arrRow);
				$objPHPExcel->disconnectWorksheets(); 				//чистим 
				unset($objPHPExcel); 						//память
				$startRow += $chunkSize;					//переходим на следующий шаг цикла, увеличивая строку, с которой будем читать файл

			}while(!$exit);

			$dataResSheet[$arrMarkAuto[$sheetIndex]] = $dataRes;

		}

		foreach($dataResSheet as $key=>$dataRes){

			echo '<strong>';
			echo $key;
			echo '</strong>';
			echo "<br/>";

			foreach($dataRes as $row){
				print_r($row);
				echo '<br/>';
				echo '<br/>';
			}
			echo "<br/>";
			echo "<hr/>";
			echo "<br/>";
			echo "<br/>";


		}

		unset($dataRes);
		unset($dataResSheet);

	}

Постоянно получаю ошибку нехватки памяти (((((((((((

 

Fatal error: Out of memory (allocated 87818240) (tried to allocate 128 bytes) in /home/work12/work12.nichost.ru/docs/wp-content/plugins/xls-importer/xls-importer.php on line 137

 

Как это исправить можно подскажите кто работал с такими объемными XLS на PHP ?


 

 

  • 0

#2 sc2r2bey

sc2r2bey
  • Пользователь
  • 34 сообщений
  • Репутация: 0

Отправлено 10 Сентябрь 2016 - 17:38

я бы подправил php.ini (это моя моя интерпритация)

max_execution_time = 60
memory_limit = 256M
post_max_size = 64M
upload_max_filesize = 64M

где:

max_execution_time - эта директива задает максимальное время в секундах, в течение которого скрипт должен полностью загрузиться. Если этого не происходит, анализатор завершает его работу. Этот механизм помогает предотвратить зависание сервера из-за криво написанного скрипта. По умолчанию на загрузку дается 30 секунд.

memory_limit - эта директива задает максимальный объем памяти в байтах, который разрешается использовать скрипту. Это помогает предотвратить ситуацию, при которой плохо написанный скрипт съедает всю доступную память сервера.

post_max_size - устанавливает максимально допустимый размер данных, отправляемых методом POST. Это значение также влияет на загрузку файлов.

upload_max_filesize - максимальный размер закачиваемого файла.


Сообщение отредактировал sc2r2bey: 10 Сентябрь 2016 - 17:39

  • 0


Оформление форума – IPBSkins.ru