ExportDistrictsService.php 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. <?php
  2. namespace App\Services\Export;
  3. use App\Models\Dictionary\District;
  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 ExportDistrictsService
  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. // Стиль заголовков
  23. $sheet->getStyle('A1:C1')->getFont()->setBold(true);
  24. $sheet->getStyle('A1:C1')->getFill()
  25. ->setFillType(Fill::FILL_SOLID)
  26. ->getStartColor()->setARGB('DDDDDD');
  27. // Данные
  28. $districts = District::orderBy('id')->get();
  29. $i = 2;
  30. foreach ($districts as $district) {
  31. $sheet->setCellValue('A' . $i, $district->id);
  32. $sheet->setCellValue('B' . $i, $district->shortname);
  33. $sheet->setCellValue('C' . $i, $district->name);
  34. $i++;
  35. }
  36. // Границы
  37. if ($i > 2) {
  38. $sheet->getStyle('A1:C' . ($i - 1))
  39. ->getBorders()
  40. ->getAllBorders()
  41. ->setBorderStyle(Border::BORDER_THIN)
  42. ->setColor(new Color('777777'));
  43. }
  44. // Автоширина колонок
  45. foreach (range('A', 'C') as $col) {
  46. $sheet->getColumnDimension($col)->setAutoSize(true);
  47. }
  48. // Сохранение
  49. $fileName = 'export_districts_' . date('Y-m-d_H-i-s') . '.xlsx';
  50. $writer = new Xlsx($spreadsheet);
  51. $fd = 'export/districts';
  52. Storage::disk('public')->makeDirectory($fd);
  53. $fp = storage_path('app/public/' . $fd . '/') . $fileName;
  54. Storage::disk('public')->delete($fd . '/' . $fileName);
  55. $writer->save($fp);
  56. $link = url('/storage/' . $fd . '/' . $fileName);
  57. // Создаём запись в таблице files
  58. File::query()->create([
  59. 'link' => $link,
  60. 'path' => $fp,
  61. 'user_id' => $userId,
  62. 'original_name' => $fileName,
  63. 'mime_type' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
  64. ]);
  65. return $link;
  66. }
  67. }