ExportAreasService.php 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. <?php
  2. namespace App\Services\Export;
  3. use App\Models\Dictionary\Area;
  4. use App\Models\File;
  5. use Illuminate\Support\Facades\Storage;
  6. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  7. use PhpOffice\PhpSpreadsheet\Style\Border;
  8. use PhpOffice\PhpSpreadsheet\Style\Color;
  9. use PhpOffice\PhpSpreadsheet\Style\Fill;
  10. use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
  11. class ExportAreasService
  12. {
  13. public function handle(int $userId): string
  14. {
  15. $spreadsheet = new Spreadsheet();
  16. $sheet = $spreadsheet->getActiveSheet();
  17. $sheet->setTitle('Районы');
  18. // Заголовки
  19. $sheet->setCellValue('A1', 'ID');
  20. $sheet->setCellValue('B1', 'Название');
  21. $sheet->setCellValue('C1', 'Округ (сокращение)');
  22. $sheet->setCellValue('D1', 'ID округа');
  23. // Стиль заголовков
  24. $sheet->getStyle('A1:D1')->getFont()->setBold(true);
  25. $sheet->getStyle('A1:D1')->getFill()
  26. ->setFillType(Fill::FILL_SOLID)
  27. ->getStartColor()->setARGB('DDDDDD');
  28. // Данные
  29. $areas = Area::with('district')->orderBy('name')->get();
  30. $i = 2;
  31. foreach ($areas as $area) {
  32. $sheet->setCellValue('A' . $i, $area->id);
  33. $sheet->setCellValue('B' . $i, $area->name);
  34. $sheet->setCellValue('C' . $i, $area->district?->shortname ?? '');
  35. $sheet->setCellValue('D' . $i, $area->district_id);
  36. $i++;
  37. }
  38. // Границы
  39. if ($i > 2) {
  40. $sheet->getStyle('A1:D' . ($i - 1))
  41. ->getBorders()
  42. ->getAllBorders()
  43. ->setBorderStyle(Border::BORDER_THIN)
  44. ->setColor(new Color('777777'));
  45. }
  46. // Автоширина колонок
  47. foreach (range('A', 'D') as $col) {
  48. $sheet->getColumnDimension($col)->setAutoSize(true);
  49. }
  50. // Сохранение
  51. $fileName = 'export_areas_' . date('Y-m-d_H-i-s') . '.xlsx';
  52. $writer = new Xlsx($spreadsheet);
  53. $fd = 'export/areas';
  54. Storage::disk('public')->makeDirectory($fd);
  55. $fp = storage_path('app/public/' . $fd . '/') . $fileName;
  56. Storage::disk('public')->delete($fd . '/' . $fileName);
  57. $writer->save($fp);
  58. $link = url('/storage/' . $fd . '/' . $fileName);
  59. // Создаём запись в таблице files
  60. File::query()->create([
  61. 'link' => $link,
  62. 'path' => $fp,
  63. 'user_id' => $userId,
  64. 'original_name' => $fileName,
  65. 'mime_type' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
  66. ]);
  67. return $link;
  68. }
  69. }