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');
     }
 }
Beispiel #2
0
 public function actionGrid2Excel()
 {
     $model = (string) filter_input(INPUT_GET, 'model');
     // $_GET['model'] - Имя модели, которая выгружается
     $commandmethod = (string) filter_input(INPUT_GET, 'commandmethod');
     // $_GET['commandmethod'] - Имя команды (cDBCommand с запросом), который выгружается
     $collist = (string) filter_input(INPUT_GET, 'collist');
     // $_GET['collist'] - Объект Имя атрибута: Строка поиска фильтра
     if ($model === '' && $commandmethod === '') {
         throw new CHttpException(500, 'Proc/Grid2Excel(): не передан параметр model или commandmethod');
     }
     if ($collist === '') {
         throw new CHttpException(500, 'Proc/Grid2Excel(): не передан параметр collist');
     }
     if ($model !== '' && !method_exists($model, 'GetPermissions')) {
         throw new CHttpException(500, 'Не существует метод "GetPermissions" модели "' . $model . '"');
     }
     if ($model !== '' && !$model::model()->GetPermissions('view')) {
         throw new CHttpException(500, 'Нет доступа для чтения модели "' . $model . '"');
     }
     ini_set('max_execution_time', 1000);
     // 1000 seconds
     ini_set('memory_limit', 1073741824);
     // 1Gbyte Max Memory
     /* Загружаем PHPExcel */
     $objPHPExcel = new PHPExcel();
     $collist = json_decode($collist);
     /* Сотрировка атрибутов */
     $sidx = (string) filter_input(INPUT_GET, 'sidx');
     $sord = (string) filter_input(INPUT_GET, 'sord') !== '' ? (string) filter_input(INPUT_GET, 'sord') : 'ASC';
     $c = 0;
     // Для количества колонок
     if ($model !== '') {
         $methodcriteria = (string) filter_input(INPUT_GET, 'criteriamethod');
         // class_exists($model, false) - дает false, непонятно почему
         /*   if (!class_exists($model, false) || !(method_exists($model, 'model') && $model::model() instanceof CActiveRecord))
              throw new CHttpException(500, $model . ' не является классом CActiveRecord'); */
         if ($methodcriteria !== '' && !method_exists($model, $methodcriteria)) {
             throw new CHttpException(500, 'Метод ' . $methodcriteria . ' отсутствует в модели ' . $model);
         }
         $criteria = $methodcriteria === '' ? new CDbCriteria() : $model::model()->{$methodcriteria}();
         // Берем критерий из модели
         if (!$criteria instanceof CDbCriteria) {
             throw new CHttpException(500, $methodcriteria . ' модели ' . $model . ' не возвращает класс CDbCriteria');
         }
         $model = $model::model();
         if ($sidx !== '') {
             $criteria->order = $sidx . ' ' . $sord;
         }
         /* Применяем критерии поиска */
         $criteria->select = [];
         foreach ($collist as $attr => $val) {
             if ($val->value !== '') {
                 Proc::CompareCriteria($attr, $val->value, $criteria);
             }
             $criteria->select[] = $attr;
         }
         /* Границы таблицы */
         $ramka = array('borders' => array('bottom' => array('style' => PHPExcel_Style_Border::BORDER_THIN), 'top' => array('style' => PHPExcel_Style_Border::BORDER_THIN), 'left' => array('style' => PHPExcel_Style_Border::BORDER_THIN), 'right' => array('style' => PHPExcel_Style_Border::BORDER_THIN)));
         /* Жирный шрифт для шапки таблицы */
         $font = array('font' => array('bold' => true), 'alignment' => array('horizontal' => PHPExcel_Style_Alignment::HORIZONTAL_CENTER));
         $rows = ARData::Data($model, $criteria)->GetDataObject();
         if (count((array) $rows) > 0) {
             foreach ($rows->values as $i => $row) {
                 foreach ($rows->fields as $col => $attr) {
                     if ($i == 0) {
                         // заполняем шапку таблицы
                         $objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow($col, $i + 1, $attr->label);
                         $objPHPExcel->getActiveSheet()->getStyleByColumnAndRow($col, $i + 1)->applyFromArray($ramka);
                         $objPHPExcel->getActiveSheet()->getStyleByColumnAndRow($col, $i + 1)->applyFromArray($font);
                     }
                     $objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow($col, $i + 2, $rows->values[$i][$attr->fieldname]);
                     $objPHPExcel->getActiveSheet()->getStyleByColumnAndRow($col, $i + 2)->applyFromArray($ramka);
                 }
             }
         }
         $c = count($rows->fields);
     } else {
         $command = DBCommands::$commandmethod();
         $command->order($sidx . ' ' . $sord);
         /* Применяем критерии поиска */
         foreach ($collist as $attr => $val) {
             if ($val->value !== '') {
                 Proc::CompareCommand($attr, $val->value, $command);
             }
         }
         $item = $command->select;
         if ($item !== '*') {
             $cols_arr = strchr($item, ', ') === false ? [str_replace('`', '', $item)] : explode(', ', str_replace('`', '', $command->Select));
             array_walk($cols_arr, function (&$item, &$key) {
                 $key = strrchr($item, ' ') === false ? $item : substr(strrchr($item, ' '), 1);
                 $item = $item;
             });
         }
         /* Функция, проверяет, есть ли атрибут в объекте $collist */
         $CheckInArray = function ($attr, $key) use($collist) {
             return property_exists($collist, $key);
         };
         /* Фильтруем список атрибутов критерия, и отсеиваем, если атрибута нет в $collist */
         $cols_arr = array_filter($cols_arr, function ($attr) use($collist) {
             $key = strrchr($attr, ' ') === false ? $attr : substr(strrchr($attr, ' '), 1);
             return property_exists($collist, $key);
         });
         $command->select($cols_arr);
         $recs = $command->queryAll();
         $r = 2;
         // Ряд в Excel, с которого заполняются данные, $r = 1 - ряд для названий атрибутов
         foreach ($recs as $i => $row) {
             $c = 0;
             Proc::ApplyDataValuesbyCommand($row, $collist, $objPHPExcel, $r, $c, $command, $i);
             $r++;
         }
     }
     /* Авторазмер колонок Excel */
     foreach (range(0, $c) as $col) {
         $objPHPExcel->getActiveSheet()->getColumnDimensionByColumn($col)->setAutoSize(true);
     }
     /* присваиваем имя файла от имени модели */
     $FileName = $model !== '' && method_exists($model, 'GetLabel') ? $model->GetLabel() : 'Выгрузка';
     // Устанавливаем имя листа
     $objPHPExcel->getActiveSheet()->setTitle($FileName);
     // Выбираем первый лист
     $objPHPExcel->setActiveSheetIndex(0);
     /* Формируем файл Excel */
     $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
     $FileName = DIRECTORY_SEPARATOR === '/' ? $FileName : mb_convert_encoding($FileName, 'Windows-1251', 'UTF-8');
     /* Proc::SaveFileIfExists() - Функция выводит подходящее имя файла, которое еще не существует. mb_convert_encoding() - Изменяем кодировку на кодировку Windows */
     $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');
     }
 }