static function ImportDo() { // Делаем запись в таблицу отчетов импорта $logreport = new Logreport(); $logreport->logreport_date = date('Y-m-d'); $logreport->save(); self::$logreport_id = $logreport->logreport_id; // Идем по файлам импорта из 1С (os.xls - Основные средства, mat.xls - Материалы) foreach (['os.xls', 'mat.xls'] as $filename) { self::$filename = dirname($_SERVER['SCRIPT_FILENAME']) . '/imp/' . $filename; self::$os = self::$filename === dirname($_SERVER['SCRIPT_FILENAME']) . '/imp/os.xls' ? true : false; var_dump(self::$filename); var_dump(file_exists(self::$filename)); if (file_exists(self::$filename)) { ini_set('max_execution_time', 1000); // 1000 seconds ini_set('memory_limit', 1073741824); // 1Gbyte Max Memory $chunkSize = 1000; //размер считываемых строк за раз $startRow = self::$os ? self::$os_start : self::$mat_start; //начинаем читать с определенной строки $exit = false; //флаг выхода $empty_value = 0; //счетчик пустых знаений // Загружаем данные из файла Excel require_once Yii::app()->basePath . '/extensions/PHPExcel/Classes/PHPExcel/IOFactory.php'; $objReader = PHPExcel_IOFactory::createReaderForFile(self::$filename); $objReader->setReadDataOnly(true); $chunkFilter = new chunkReadFilter(); $objReader->setReadFilter($chunkFilter); // Грузим правила импорта для сотрудников self::$employeewords = ARData::Data(Importemployee::model())->GetDataObject(); // Определяем показатели импорта self::$logreport_errors = 0; // Не загружено записей из-за ошибок self::$logreport_updates = 0; // Записей изменено self::$logreport_additions = 0; // Записей добавлено self::$logreport_missed = 0; // Записей пропущено (исключены из обработки) self::$logreport_amount = 0; // Всего записей while (!$exit) { // Инициализируем переменные // $row = $sheetData[self::$rownum_xls]; $chunkFilter->setRows($startRow, $chunkSize); //устанавливаем знаечние фильтра $objPHPExcel = $objReader->load(self::$filename); //открываем файл $objPHPExcel->setActiveSheetIndex(0); //устанавливаем индекс активной страницы $objWorksheet = $objPHPExcel->getActiveSheet(); //делаем активной нужную страницу // Идем по данных excel for ($i = $startRow; $i < $startRow + $chunkSize; $i++) { //внутренний цикл по строкам self::$rownum_xls = $i; $value = trim(htmlspecialchars($objWorksheet->getCellByColumnAndRow(0, $i)->getValue())); //получаем первое знаение в строке if (empty($value)) { //проверяем значение на пустоту $empty_value++; } if ($empty_value == 1) { //после трех пустых значений, завершаем обработку файла, думая, что это конец $exit = true; break; } /* Манипуляции с данными каким Вам угодно способом, в PHPExcel их превеликое множество */ $row = $objWorksheet->rangeToArray('A' . $i . ':Q' . $i, null, true, true, true); $row = $row[key($row)]; $material = new Material(); $employee = new Employee(); $mattraffic = new Mattraffic(); $matlog = new Matlog(); $employeelog = new Employeelog(); $traflog = new Traflog(); $MaterialDo = false; $EmployeeDo = false; $MattrafficDo = false; // Применяем значения атрубутов Материальной ценности $MaterialDo = self::MaterialDo($material, $matlog, $row); if ($MaterialDo) { // Применяем значения атрубутов Сотрудника $EmployeeDo = self::EmployeeDo($employee, $employeelog, $row); if ($EmployeeDo) { // Применяем значения атрубутов "Операции над материальной ценностью" $MattrafficDo = self::MattrafficDo($mattraffic, $traflog, $row, $material, $employee->employee_id); } } // Начинаем транзакцию $transaction = Yii::app()->db->beginTransaction(); try { // $matlog->matlog_type !== 5 - Если Запись не изменилась не пишем в лог if ($matlog->matlog_type !== 5 && ($MaterialDo || count($material->getErrors()) > 0)) { $matlog->save(false); } if ($MaterialDo) { // $employeelog->employeelog_type !== 5 - Если Запись не изменилась не пишем в лог if ($employeelog->employeelog_type !== 5 && ($EmployeeDo || count($employee->getErrors()) > 0)) { $employeelog->save(false); } if ($EmployeeDo) { if ($MattrafficDo || count($mattraffic->getErrors()) > 0) { if ($matlog->IsNewRecord) { $matlog->material_number = $material->material_number; // Иначе пишется предыдущее значение количества материальной ценности $matlog->save(false); } if ($employeelog->IsNewRecord) { $employeelog->save(false); } $traflog->id_matlog = $matlog->matlog_id; $traflog->id_employeelog = $employeelog->employeelog_id; $traflog->save(false); } if ($MattrafficDo) { $material->save(false); $employee->save(false); $mattraffic->id_material = $material->material_id; $mattraffic->id_mol = $employee->employee_id; $mattraffic->save(false); // Применяем значения атрубутов, если материальная ценность списна self::WriteOffDo($material, $matlog, $mattraffic, $traflog, $row); } } } $transaction->commit(); } catch (Exception $e) { $transaction->rollback(); throw new CException($e->getMessage() . ' $rownum_xls = ' . self::$rownum_xls . '; $filename = ' . self::$filename); } } $objPHPExcel->disconnectWorksheets(); //чистим unset($objPHPExcel); //память $startRow += $chunkSize; //переходим на следующий шаг цикла, увеличивая строку, с которой будем читать файл } $logreport->logreport_additions += self::$logreport_additions; $logreport->logreport_updates += self::$logreport_updates; $logreport->logreport_errors += self::$logreport_errors; $logreport->logreport_missed += self::$logreport_missed; $logreport->logreport_amount += self::$rownum_xls - (self::$os ? self::$os_start : self::$mat_start); $logreport->save(); } } ARData::Data(Traflog::model(), Traflog::model()->Test())->PrintData(); echo '<BR>'; ARData::Data(Matlog::model(), Matlog::model()->Test())->PrintData(); echo '<BR>'; ARData::Data(Employeelog::model(), Employeelog::model()->Test())->PrintData(); echo '<BR>'; ARData::Data(Material::model(), Material::model()->Test())->PrintData(); echo '<BR> Акты списания'; ARData::Data(Writeoffakt::model(), Writeoffakt::model()->Test())->PrintData(); }
public function actionGetLogreport() { $logreportid = (string) filter_input(INPUT_GET, 'logreportid'); if ($logreportid === '') { throw new CHttpException(500, 'Fregat/Fregat/GetLogreport((): не передан параметр logreportid'); } ini_set('max_execution_time', 1000); // 1000 seconds ini_set('memory_limit', 1073741824); // 1Gbyte Max Memory /* Загружаем PHPExcel */ $objPHPExcel = new PHPExcel(); /* Границы таблицы */ $ramka = array('borders' => array('allborders' => array('style' => PHPExcel_Style_Border::BORDER_THIN))); /* Жирный шрифт для шапки таблицы */ $font = array('font' => array('bold' => true), 'alignment' => array('horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_CENTER)); $rows = ARData::Data(Logreport::model(), Logreport::model()->GetLogreportCriteria($logreportid))->GetDataObject(); $itog = $objPHPExcel->getActiveSheet(); $itog->setTitle('Итоги'); $matsheet = $objPHPExcel->createSheet(1); $matsheet->setTitle('Материальные ценности'); $empsheet = $objPHPExcel->createSheet(2); $empsheet->setTitle('Сотрудники'); $trafsheet = $objPHPExcel->createSheet(3); $trafsheet->setTitle('Операции над мат. ценностями'); $itog->setCellValueByColumnAndRow(0, 1, 'Отчет импорта №' . $logreportid); $itog->setCellValueByColumnAndRow(0, 2, 'Дата: ' . date('d.m.Y', strtotime($rows->values[0]['logreport_date']))); $itog->getStyle('A2')->applyFromArray(array('font' => array('italic' => true, 'size' => 12))); $itog->setCellValueByColumnAndRow(0, 4, Logreport::model()->getAttributeLabel('logreport_amount')); $itog->setCellValueByColumnAndRow(1, 4, Logreport::model()->getAttributeLabel('logreport_additions')); $itog->setCellValueByColumnAndRow(2, 4, Logreport::model()->getAttributeLabel('logreport_updates')); $itog->setCellValueByColumnAndRow(3, 4, Logreport::model()->getAttributeLabel('logreport_errors')); $itog->setCellValueByColumnAndRow(4, 4, Logreport::model()->getAttributeLabel('logreport_missed')); $itog->setCellValueByColumnAndRow(0, 5, $rows->values[0]['logreport_amount']); $itog->setCellValueByColumnAndRow(1, 5, $rows->values[0]['logreport_additions']); $itog->setCellValueByColumnAndRow(2, 5, $rows->values[0]['logreport_updates']); $itog->setCellValueByColumnAndRow(3, 5, $rows->values[0]['logreport_errors']); $itog->setCellValueByColumnAndRow(4, 5, $rows->values[0]['logreport_missed']); $itog->getStyle('A4:E5')->applyFromArray($ramka); $itog->getStyle('A4:E4')->applyFromArray($font); $itog->getStyle('A1')->applyFromArray(array('font' => array('bold' => true, 'size' => 14), 'alignment' => array('horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_CENTER))); $itog->mergeCells('A1:E1'); $c = count($rows->fields); /* Авторазмер колонок Excel */ foreach (range(0, $c) as $col) { $itog->getColumnDimensionByColumn($col)->setAutoSize(true); } // ---------------- Материальные ценности ------------------------------------------ $rows = ARData::Data(Matlog::model(), Matlog::model()->GetMatlogCriteria($logreportid))->GetDataObject(); $this->ExcelApplyValues($matsheet, $rows, ['date' => ['material_release'], 'string' => ['material_1c', 'material_inv', 'material_serial'], 'case' => ['material_tip' => [1 => 'Основное средство', 2 => 'Материал']]]); // ----------------------- Сотрудники ------------------------------- $rows = ARData::Data(Employeelog::model(), Employeelog::model()->GetEmployeelogCriteria($logreportid))->GetDataObject(); $this->ExcelApplyValues($empsheet, $rows); // ---------------------- Операции над материальными ценностями ------------------------------------------- $rows = ARData::Data(Traflog::model(), Traflog::model()->GetTraflogCriteria($logreportid))->GetDataObject(); $this->ExcelApplyValues($trafsheet, $rows, ['string' => ['material_1c', 'material_inv']]); /* присваиваем имя файла от имени модели */ $FileName = 'Отчет импорта в систему Фрегат'; // Устанавливаем имя листа // $itog->setTitle($FileName); // Выбираем первый лист $objPHPExcel->setActiveSheetIndex(0); /* Формируем файл Excel */ $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); /* Proc::SaveFileIfExists() - Функция выводит подходящее имя файла, которое еще не существует. mb_convert_encoding() - Изменяем кодировку на кодировку Windows */ $FileName = DIRECTORY_SEPARATOR === '/' ? $FileName : mb_convert_encoding($FileName, 'Windows-1251', 'UTF-8'); $fileroot = Proc::SaveFileIfExists('files/' . $FileName . '.xlsx'); /* Сохраняем файл в папку "files" */ $objWriter->save('files/' . $fileroot); /* Возвращаем имя файла Excel */ if (DIRECTORY_SEPARATOR === '/') { echo $fileroot; } else { echo mb_convert_encoding($fileroot, 'UTF-8', 'Windows-1251'); } }