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)