Laravel 5.8中Excel::download()参数类型错误排查求助
解决Laravel 5.8 + Maatwebsite Excel下载报错:Argument 2 passed must be of type string, object given
这个错误的根源很明确——你调用Excel::download()的参数顺序完全搞反了,还多做了一次不必要的download()调用,咱们一步步来修正:
错误原因拆解
在适配Laravel 5.8的Maatwebsite Excel 2.x版本中,Excel::download()方法的参数规则是:
- 第一个参数:导出逻辑的闭包,或者自定义的导出类实例(是一个对象)
- 第二个参数:导出文件的名称(字符串,最好带上后缀如
.xlsx)
你现在的代码把文件名'Student_Data'放在了第一个参数位,闭包放在了第二个位置,这就导致方法收到的第二个参数是闭包对象,不符合它要求的string类型,直接触发了报错。另外你最后链式调用的->download('xlsx')也是多余的,因为Excel::download()本身就会生成并返回下载响应。
修正后的完整代码
public function excel_report() { $student_data = DB::table('student_details')->get()->toArray(); $student_array[] = array('Name', 'Address', 'Roll No', 'Class'); foreach($student_data as $student) { $student_array[] = array( // 这里顺便修正了键名和表头不匹配的问题,避免导出后数据列错位 'Name' => $student->st_name, 'Address' => $student->address, 'Roll No' => $student->roll_no, 'Class' => $student->st_class ); } // 调整参数顺序,去掉多余的download()调用,同时加上return返回响应 return Excel::download(function($excel) use ($student_array){ $excel->setTitle('Student Datas'); $excel->sheet('Student_Datass', function($sheet) use ($student_array){ $sheet->fromArray($student_array, null, 'A1', false, false); }); }, 'Student_Data.xlsx'); }
额外注意事项
- 一定要加上
return语句:Laravel需要把Excel::download()生成的响应返回给浏览器,否则用户不会收到下载提示。 - 表头和数据键名匹配:我帮你把数组里的
'Student Name'改成了'Name',和你定义的表头保持一致,这样导出的Excel里数据才会对应正确的列。 - 确认版本兼容性:确保你的项目安装的是Maatwebsite Excel 2.x版本(Laravel 5.8不支持3.x及以上版本),如果不确定,可以查看
composer.json里的依赖项。
内容的提问来源于stack exchange,提问作者user9461494
相关产品推荐
相关产品推荐

