You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Filament 3中选择日期范围并批量导出多表Excel数据

解决方案

1. 修改Reports页面类代码

替换原有的Reports.php代码为以下内容,添加日期范围属性、合并导出按钮并传递日期参数:

<?php

namespace App\Filament\Pages;

use App\Livewire\BillsReportsStats;
use Filament\Actions\Action;
use Filament\Forms\Components\DatePicker;
use Filament\Forms\Components\Grid;
use Filament\Pages\Page;
use Maatwebsite\Excel\Facades\Excel;
use App\Exports\EmailReport;
use App\Exports\MessagesReport;
use App\Exports\WhatsappMessagesReport;
use Symfony\Component\HttpFoundation\StreamedResponse;

class Reports extends Page
{
    protected static ?string $navigationIcon = 'heroicon-o-document-text';
    protected static string $view = 'filament.pages.reports';

    // 存储用户选择的起止日期
    public ?string $startDate = null;
    public ?string $endDate = null;

    protected function getHeaderActions(): array
    {
        return [
            Action::make('exportAll')
                ->label('导出全部报表')
                ->color('primary')
                ->icon('heroicon-o-cloud-arrow-down')
                ->form([
                    Grid::make(2)
                        ->schema([
                            DatePicker::make('startDate')
                                ->label('开始日期')
                                ->required(),
                            DatePicker::make('endDate')
                                ->label('结束日期')
                                ->required()
                                ->afterOrEqual('startDate'),
                        ]),
                ])
                ->action('exportAllReports'),
        ];
    }

    // 批量导出三个报表为压缩包
    public function exportAllReports(): StreamedResponse
    {
        $tenantSlug = str(filament()->getTenant()->name)->slug();
        
        return Excel::download([
            new EmailReport($this->startDate, $this->endDate),
            new MessagesReport($this->startDate, $this->endDate),
            new WhatsappMessagesReport($this->startDate, $this->endDate),
        ], "{$tenantSlug}-all-reports.zip");
    }

    protected function getHeaderWidgets(): array
    {
        return [
            BillsReportsStats::class,
        ];
    }
}

2. 修改导出类以支持日期过滤

需要分别修改EmailReport.php、MessagesReport.php、WhatsappMessagesReport.php,让它们接收日期参数并添加范围过滤,以EmailReport为例:

<?php

namespace App\Exports;

use App\Models\Email;
use Maatwebsite\Excel\Concerns\FromQuery;
use Maatwebsite\Excel\Concerns\WithHeadings;

class EmailReport implements FromQuery, WithHeadings
{
    protected $startDate;
    protected $endDate;

    // 构造函数接收日期参数
    public function __construct(string $startDate, string $endDate)
    {
        $this->startDate = $startDate;
        $this->endDate = $endDate;
    }

    public function query()
    {
        // 根据日期范围过滤数据,替换为你表中实际的时间字段(如sent_at)
        return Email::query()
            ->whereBetween('created_at', [$this->startDate . ' 00:00:00', $this->endDate . ' 23:59:59'])
            ->where('tenant_id', filament()->getTenant()->id); // 多租户过滤(按需保留)
    }

    public function headings(): array
    {
        // 返回你的表头字段,示例:
        return [
            'ID',
            '邮箱地址',
            '主题',
            '创建时间',
            // 其他自定义字段
        ];
    }
}

MessagesReport和WhatsappMessagesReport执行相同逻辑,替换对应的模型和时间字段即可。

3. (可选)页面主体添加日期选择器

若希望在页面主体而非仅弹窗显示日期选择器,修改filament/pages/reports.blade.php:

<x-filament-panels::page>
    <x-filament-forms::form wire:submit="exportAllReports">
        <x-filament-forms::grid :columns="2">
            <x-filament-forms::field-wrapper label="开始日期">
                {{ $this->form->getComponent('startDate') }}
            </x-filament-forms::field-wrapper>
            <x-filament-forms::field-wrapper label="结束日期">
                {{ $this->form->getComponent('endDate') }}
            </x-filament-forms::field-wrapper>
        </x-filament-forms::grid>

        <x-filament-forms::actions :actions="$this->getHeaderActions()" />
    </x-filament-forms::form>

    {{-- 原有页面内容 --}}
    @livewire(\App\Livewire\BillsReportsStats::class)
</x-filament-panels::page>

关键说明

  • 导出功能会将三个Excel文件打包为ZIP包,用户单次下载即可获取全部报表
  • 日期选择器添加了结束日期不早于开始日期的验证规则
  • 请根据数据库表的实际时间字段调整whereBetween中的字段名

内容的提问来源于stack exchange,提问作者erroDecoder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 12:45:12