| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- <?php
- namespace App\Services\Export;
- use App\Models\Dictionary\District;
- 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 ExportDistrictsService
- {
- 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->getStyle('A1:C1')->getFont()->setBold(true);
- $sheet->getStyle('A1:C1')->getFill()
- ->setFillType(Fill::FILL_SOLID)
- ->getStartColor()->setARGB('DDDDDD');
- // Данные
- $districts = District::orderBy('id')->get();
- $i = 2;
- foreach ($districts as $district) {
- $sheet->setCellValue('A' . $i, $district->id);
- $sheet->setCellValue('B' . $i, $district->shortname);
- $sheet->setCellValue('C' . $i, $district->name);
- $i++;
- }
- // Границы
- if ($i > 2) {
- $sheet->getStyle('A1:C' . ($i - 1))
- ->getBorders()
- ->getAllBorders()
- ->setBorderStyle(Border::BORDER_THIN)
- ->setColor(new Color('777777'));
- }
- // Автоширина колонок
- foreach (range('A', 'C') as $col) {
- $sheet->getColumnDimension($col)->setAutoSize(true);
- }
- // Сохранение
- $fileName = 'export_districts_' . date('Y-m-d_H-i-s') . '.xlsx';
- $writer = new Xlsx($spreadsheet);
- $fd = 'export/districts';
- 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;
- }
- }
|