Laravel Maatwebsite Excel 2.x生成失败及请求参数为空问题求助
Laravel + Maatwebsite Excel 2.x 导出报表踩坑求助(已整理解决思路)
我最近在Laravel项目里用Maatwebsite Excel 2.x做报表导出,需求很明确:根据前端选择的起止日期查询数据库记录,然后生成Excel文件下载。但现在遇到两个头疼的问题:
- 点击生成按钮后,前端的日期参数(from/to)根本传不到后端,打印
$request->from始终是空的 - 后端还报错
Laravel Excel method [download] does not exist,而且因为其他组件的导入功能依赖2.x版本,完全没法升级到3.x,急死人了!
下面是我的代码,麻烦各位帮忙看看:
控制器代码
public function generateReport(Request $request){ $date = \DB::table('checkers') ->where('remarks_id',2) ->join('schedules','schedules.id','=','checkers.schedule_id') ->join('teachers','schedules.teacher_id','=','teachers.id') ->join('subject_codes','subject_codes.id','=','schedules.subject_code_id') ->join('remarks','remarks.id','=','checkers.remarks_id') ->where('checkers.created_at', '=>', $request->from) // 这里有个笔误! ->where('checkers.created_at', '<=', $request->to) // ->whereBetween('checkers.created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()]) ->select('teachers.fullname','subject_codes.subject_description','remarks.remarks_desc','checkers.created_at') ->get(); dd($request->from); return Excel::download('users.xlsx'); // 2.x里根本没有这个方法! }
Vue组件代码
<form action=""> <div class="col-xs-4 form-group"> <label>Start Date</label> <date-picker name="from" id="from" v-model="from" :config="options"></date-picker> </div> <div class="col-xs-4 form-group"> <label>End Date</label> <date-picker name="to" id="to" v-model="to" :config="options"></date-picker> </div> </form> </div> <div class="box-footer"> <a type="button" href="/generate" > <button class="btn btn-info"> Generate Excel </button> </a> </div>
Vue脚本代码
data(){ return{ from: new Date(), options: { format: 'YYYY-MM-DD', showClear: true, showClose: true, }, to: new Date(), options: { // 这里重复定义options,会覆盖前面的! format: 'YYYY-MM-DD', showClear: true, showClose: true, } } }, created() { console.log('Component mounted.') }, methods:{ generate(){ axios.get('/generate') // 没带参数! .then((res)=>{ console.log('asd') }) } }
路由配置
// routes.php Route::get('/generate', [YourReportController::class, 'generateReport']);
解决思路(分两步搞定)
第一步:解决参数无法传递的问题
- 修复Vue数据里的重复定义:你在data里写了两次
options,后面的会覆盖前面的,合并成一个即可:
data(){ return{ from: new Date(), to: new Date(), options: { format: 'YYYY-MM-DD', showClear: true, showClose: true, } } },
- 修改按钮的请求逻辑:原来的a标签跳转是不带参数的GET请求,改成用按钮绑定click事件,通过axios带参数请求后端:
<!-- 替换原来的a标签+按钮 --> <button class="btn btn-info" @click="generate"> Generate Excel </button>
- 在generate方法里传递参数并处理下载:axios请求时要带上
params,并且因为后端返回的是二进制流,需要手动创建下载链接:
methods:{ generate(){ axios.get('/generate', { params: { from: this.from, to: this.to }, responseType: 'blob' // 必须加这个,否则下载的文件会损坏 }) .then((res)=>{ // 处理Excel文件下载 const url = window.URL.createObjectURL(new Blob([res.data])); const link = document.createElement('a'); link.href = url; link.setAttribute('download', 'users.xlsx'); document.body.appendChild(link); link.click(); // 清理临时链接 window.URL.revokeObjectURL(url); document.body.removeChild(link); }) .catch(err => { console.error('导出失败:', err); }) } }
第二步:解决Excel下载方法不存在的问题
Maatwebsite Excel 2.x和3.x的API完全不一样,2.x里没有Excel::download()这个静态方法,正确的写法是用Excel::create()创建文件,再调用download():
use Maatwebsite\Excel\Facades\Excel; // 确保顶部引入门面 public function generateReport(Request $request){ // 获取并验证参数 $from = $request->input('from'); $to = $request->input('to'); // 修复查询里的运算符错误:把=>改成>=! $data = \DB::table('checkers') ->where('remarks_id',2) ->join('schedules','schedules.id','=','checkers.schedule_id') ->join('teachers','schedules.teacher_id','=','teachers.id') ->join('subject_codes','subject_codes.id','=','schedules.subject_code_id') ->join('remarks','remarks.id','=','checkers.remarks_id') ->where('checkers.created_at', '>=', $from) ->where('checkers.created_at', '<=', $to) ->select('teachers.fullname','subject_codes.subject_description','remarks.remarks_desc','checkers.created_at') ->get(); // 2.x正确的导出写法 return Excel::create('users', function($excel) use ($data) { // 创建一个工作表 $excel->sheet('考勤报表', function($sheet) use ($data) { // 把查询结果填充到工作表 $sheet->fromArray($data); // 可以自定义表头,比如: // $sheet->row(1, ['教师姓名', '课程名称', '备注描述', '创建时间']); // $sheet->fromArray($data, null, 'A2', false, false); }); })->download('xlsx'); }
另外,还要确保你的Laravel项目里正确安装并配置了Maatwebsite Excel 2.x,比如config/excel.php存在,服务提供者已经注册。
内容的提问来源于stack exchange,提问作者Vince
相关产品推荐
相关产品推荐

