]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
Правки генерации эксель
authorfomichev <vladimir.fomichev@erp-flowers.ru>
Fri, 13 Dec 2024 06:43:51 +0000 (09:43 +0300)
committerfomichev <vladimir.fomichev@erp-flowers.ru>
Fri, 13 Dec 2024 06:43:51 +0000 (09:43 +0300)
erp24/controllers/UsersMessageManagementController.php

index d4c3268528ce3d1ba78c0f3cb4a8ec576f5f6e4f..75ac91d483d830a79a1896accd9dee2e372334c6 100644 (file)
@@ -119,50 +119,57 @@ class UsersMessageManagementController extends Controller
 
     public function actionGenerateExcel($date, $type)
     {
-        $data = Users::getUsersListForKogort($date);
+        try {
+            $data = Users::getUsersListForKogort($date);
+            if (empty($data)) {
+                Yii::$app->session->setFlash('error', 'Нет данных для экспорта.');
+                return $this->redirect(Yii::$app->request->referrer);
+            }
 
-        $spreadsheet = new Spreadsheet();
-        $sheet = $spreadsheet->getActiveSheet();
+            $spreadsheet = new Spreadsheet();
+            $sheet = $spreadsheet->getActiveSheet();
+            $sheet->setTitle('Users');
 
-        if (!empty($data)) {
             $fields = array_keys($data[0]->getAttributes());
-        } else {
-            Yii::$app->session->setFlash('error', 'Нет данных для экспорта.');
-            return $this->redirect(Yii::$app->request->referrer);
-        }
 
-        $columnIndex = 1;
-        foreach ($fields as $field) {
-            $sheet->setCellValue(Coordinate::stringFromColumnIndex($columnIndex) . '1', $field);
-            $columnIndex++;
-        }
-
-        $row = 2;
-        foreach ($data as $user) {
-            $columnIndex = 1;
-            foreach ($fields as $field) {
-                $sheet->setCellValue(Coordinate::stringFromColumnIndex($columnIndex) . $row, $user->$field);
-                $columnIndex++;
+            foreach ($fields as $index => $field) {
+                $column = Coordinate::stringFromColumnIndex($index + 1);
+                $sheet->setCellValue("{$column}1", $field);
             }
-            $row++;
-        }
-
-        $sheet->setTitle('Users');
-
-        $response = Yii::$app->response;
-        $response->format = \yii\web\Response::FORMAT_RAW;
-
-
-        $response->headers->set('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
-        $response->headers->set('Content-Disposition', 'attachment; filename="users-' . $type . '-' . $date . '.xlsx"');
-        $response->headers->set('Cache-Control', 'max-age=0');
-        $response->headers->add('Pragma', 'public');
 
+            foreach ($data as $rowIndex => $user) {
+                foreach ($fields as $columnIndex => $field) {
+                    $column = Coordinate::stringFromColumnIndex($columnIndex + 1);
+                    $sheet->setCellValue(
+                        "{$column}" . ($rowIndex + 2),
+                        $user->$field
+                    );
+                }
+            }
 
-        $writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet);
-        $writer->save('php://output');
-        Yii::$app->end();
-        return null;
+            $filename = "users-{$type}-{$date}.xlsx";
+            $response = Yii::$app->response;
+            $response->format = \yii\web\Response::FORMAT_RAW;
+            $response->headers->set('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
+            $response->headers->set('Content-Disposition', "attachment; filename=\"{$filename}\"");
+            $response->headers->set('Cache-Control', 'max-age=0');
+            $response->headers->add('Pragma', 'public');
+
+            ob_clean();
+            $writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet);
+            $writer->save('php://output');
+
+            return null;
+        } catch (\Exception $e) {
+            Yii::error("Excel generation error: " . $e->getMessage());
+            Yii::$app->session->setFlash('error', 'Произошла ошибка при генерации Excel файла.');
+            return $this->redirect(Yii::$app->request->referrer);
+        } finally {
+            if (isset($spreadsheet)) {
+                $spreadsheet->disconnectWorksheets();
+                unset($spreadsheet);
+            }
+        }
     }
 
     public function actionViewKogortUsers($date, $type)