Bu örnek, maatwebsite/excel paketini kullanır.
1. Route
Route::get('/export-excel', [App\Http\Controllers\MyController::class, 'excel'])->name('export-excel'); 2. Basit Görünüm
Tarih girişi ve indirmeyi tetikleyen bir buton bulunur.
3. Controller
Not: Eğer sorgu uzun sürüyorsa, sayfaları ayırmak daha iyidir. Ayrı dosyalar oluşturun ve FromQuery ile WithChunkReading kullanmaya çalışın.
use Illuminate\Http\Request;
use Maatwebsite\Excel\Facades\Excel;
use App\Excels\Exports\MyExport;
use Illuminate\Support\Facades\DB;
class MyController extends Controller
{
public function excel(Request $request)
{
$start = $request->start_date;
$end = $request->end_date;
// Sheet 1
$sheet1 = DB::table('users')
->select('name', 'email')
->whereBetween('created_at', [$start, $end])
->get()
->map(fn($r) => [$r->name, $r->email]);
// Sheet 2
$sheet2 = DB::table('orders')
->select('invoice', 'total')
->whereBetween('created_at', [$start, $end])
->get()
->map(fn($r) => [$r->invoice, $r->total]);
return Excel::download(new MyExport($sheet1, $sheet2), 'report.xlsx');
}
}
4. Çoklu Sayfalar
namespace App\Excels\Exports;
use Maatwebsite\Excel\Concerns\WithMultipleSheets;
use App\Excels\Exports\Sheets\MySheet;
class MyExport implements WithMultipleSheets
{
public function __construct(protected $sheet1, protected $sheet2) {}
public function sheets(): array
{
return [
new MySheet($this->sheet1, 'Users'),
new MySheet($this->sheet2, 'Orders'),
];
}
}
5. Sheet Sınıfı
Her bir örnek, bir Excel sekmesini temsil eder.
namespace App\Excels\Exports\Sheets;
use Maatwebsite\Excel\Concerns\FromArray;
use Maatwebsite\Excel\Concerns\WithTitle;
use Illuminate\Support\Collection;
class MySheet implements FromArray, WithTitle
{
public function __construct(protected $data, protected $title) {}
public function array(): array
{
if ($this->title === 'Users') {
return [
['NAME', 'EMAIL'],
...$this->data->toArray(),
];
}
return [
['INVOICE', 'TOTAL'],
...$this->data->toArray(),
];
}
public function title(): string
{
return $this->title;
}
}
Kaynak: Orijinal Makale


