| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- <?php
- namespace App\Services\Export;
- use App\Models\Dictionary\Area;
- use App\Models\File;
- use Illuminate\Support\Facades\Storage;
- use PhpOffice\PhpSpreadsheet\Spreadsheet;
- use PhpOffice\PhpSpreadsheet\Style\Border;
- use PhpOffice\PhpSpreadsheet\Style\Color;
- use PhpOffice\PhpSpreadsheet\Style\Fill;
- use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
- class ExportAreasService
- {
- public function handle(int $userId): string
- {
- $spreadsheet = new Spreadsheet();
- $sheet = $spreadsheet->getActiveSheet();
- $sheet->setTitle('Районы');
- // Заголовки
- $sheet->setCellValue('A1', 'ID');
- $sheet->setCellValue('B1', 'Название');
- $sheet->setCellValue('C1', 'Округ (сокращение)');
- $sheet->setCellValue('D1', 'ID округа');
- // Стиль заголовков
- $sheet->getStyle('A1:D1')->getFont()->setBold(true);
- $sheet->getStyle('A1:D1')->getFill()
- ->setFillType(Fill::FILL_SOLID)
- ->getStartColor()->setARGB('DDDDDD');
- // Данные
- $areas = Area::with('district')->orderBy('name')->get();
- $i = 2;
- foreach ($areas as $area) {
- $sheet->setCellValue('A' . $i, $area->id);
- $sheet->setCellValue('B' . $i, $area->name);
- $sheet->setCellValue('C' . $i, $area->district?->shortname ?? '');
- $sheet->setCellValue('D' . $i, $area->district_id);
- $i++;
- }
- // Границы
- if ($i > 2) {
- $sheet->getStyle('A1:D' . ($i - 1))
- ->getBorders()
- ->getAllBorders()
- ->setBorderStyle(Border::BORDER_THIN)
- ->setColor(new Color('777777'));
- }
- // Автоширина колонок
- foreach (range('A', 'D') as $col) {
- $sheet->getColumnDimension($col)->setAutoSize(true);
- }
- // Сохранение
- $fileName = 'export_areas_' . date('Y-m-d_H-i-s') . '.xlsx';
- $writer = new Xlsx($spreadsheet);
- $fd = 'export/areas';
- Storage::disk('public')->makeDirectory($fd);
- $fp = storage_path('app/public/' . $fd . '/') . $fileName;
- Storage::disk('public')->delete($fd . '/' . $fileName);
- $writer->save($fp);
- $link = url('/storage/' . $fd . '/' . $fileName);
- // Создаём запись в таблице files
- File::query()->create([
- 'link' => $link,
- 'path' => $fp,
- 'user_id' => $userId,
- 'original_name' => $fileName,
- 'mime_type' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
- ]);
- return $link;
- }
- }
|