原文链接:http://laravelacademy.org/post/2024.html
GitHub地址:https://github.com/Maatwebsite/Laravel-Excel
一、安装
根目录下安装依赖
composer require maatwebsite/excel ~2.0.0
安装成功之后
发现composer.json文件里的"require"多了一行:
"maatwebsite/excel": "~2.1.0",
还有vendor目录下面多了一个maatwebsite的文件夹
二、配置
在config/app.php
中注册服务提供者到providers数组:
Maatwebsite\Excel\ExcelServiceProvider::class,
同样在config/app.php
中注册门面到aliases数组:
'Excel' => Maatwebsite\Excel\Facades\Excel::class,
如果想要对Laravel Excel进行更多的自定义配置,执行以下命令:
php artisan vendor:publish
执行成功后会在config目录下生成一个配置文件excel.php
可以自行修改excel的配置信息
三、导出Excel文件
执行
php artisan make:controller ExcelController
生成一个Excel的控制器
并在routes/api.php里添加路由信息
Route::get('excel/export','ExcelController@export');
Route::get('excel/import','ExcelController@import');
然后在ExcelController 里定义export文件导出方法
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class ExcelController extends Controller
//Excel文件导出功能 By Laravel学院
public function export(){
['10001','AAAAA','99','150-xxxx-xxxx'],
['10002','BBBBB','92','137-xxxx-xxxx'],
['10003','CCCCC','95','157-xxxx-xxxx'],
['10004','DDDDD','89','177-xxxx-xxxx'],
['10005','EEEEE','96','188-xxxx-xxxx'],
['10006','FFFFF','96','180-xxxx-xxxx'],
['10007','ggggg','96','181-xxxx-xxxx'],
['10008','HHHHH','96','182-xxxx-xxxx'],
* 如果你要导出csv或者xlsx文件,只需将 export 方法中的参数改成csv或xlsx即可。
* 如果还要将该Excel文件保存到服务器上,可以使用 store 方法:
Excel::create(iconv('UTF-8', 'GBK', '模板文件'),function($excel) use ($cellData){
$excel->sheet('score', function($sheet) use ($cellData){
})->store('xls')->export('xls');
iconv('UTF-8', 'GBK', '模板文件'),function($excel) use ($cellData){
$excel->sheet('score', function($sheet) use ($cellData){
})->store('xls')->export('xls');
我们在浏览器中访问http://laravel.app:8000/api/excel/export
,会导出一个名为模板文件.xls
的Excel文件
如果你要导出csv或者xlsx文件,只需将export
方法中的参数改成csv或xlsx即可。
如果在windows上反倒不需要加iconv('UTF-8', 'GBK', '模板文件')就可以正常输出中文不会乱码,linux上面必须设置转码
在这里被坑了一把,一开始直接参照模板来,没有在export导出方法里改那个iconv
然后直接在import里直接套用的里面带有iconv的导入方法,然后一直报一个
Notice: iconv() [function.iconv]: Detected an illegal character in input string ...
这样的错误,然后按照网上的各种方法也改了,也还是没用,然后最后是先把export里的文件在创建的时候就要跟import里的一样用iconv,在下面导入Excel的时候才不会报那个错误。。。。
如果是要把数据库里的某个表或者某两个表的数据用excel导出而且还可以自己控制筛选条件,并且是和前端进行对接,我的做法是直接把文件导出保存在服务器,返回返回前端可以下载此文件的url地址。进行了如下尝试,也可以很好的满足我的需求。
比如
在service层写一个筛选数据源的方法
public static function beforeExportExcel($data){
$cellData =Train::whereHas('TrainSignup', function ($query) {
$query->where('audit_status', '=', 1);
->select('name', 'id_no', 'mobile');
if(isset($data['train_class_id'])){
$cellData->where('train_class_id',$data['train_class_id']);
$cellData=$cellData->get()->toArray();
$cellData1 = array('姓名','身份证号','移动电话');
array_unshift($cellData, $cellData1);
在controller层
public function export(Request $request)
$data = $request->json()->all();
$this->validate($request, [
$format=isset($data['format'])?$data['format']:'xls';
$name=isset($data['table_name'])?$data['table_name']:'xxx';
//调用刚刚在service层写的获取数据源的方法
$response= xxxService::beforeExportExcel($data);
$resource_path='/storage/uploads/file/';
$file_path =public_path().$resource_path.date('Y').'/'.date('m').'/'.date('d');
if (!is_dir($file_path)){
mkdir($file_path,0775, true);
ExcelController::export($response,$name,$format);
$domain =Config::get('app.domain');
$url =$domain.$resource_path.date('Y').'/'.date('m').'/'.date('d').'/'.$name.'.'.$format;
$ret = RetObject::genSuccess('导出成功',$url);
return response()->json($ret);
在这里设置了文件的保存路径,注意在再上面config目录下生成的excel.php文件中,找到store的path修改为跟上面一致的路径
|--------------------------------------------------------------------------
|--------------------------------------------------------------------------
| The path we want to save excel file to
'path' => public_path().'/storage/uploads/file/'.date('Y').'/'.date('m').'/'.date('d'),
|--------------------------------------------------------------------------
|--------------------------------------------------------------------------
| Whether we want to return information about the stored file or not
新建一个类,写一个导出保存excel的公共方法
class ExcelController extends Controller
public static function export($cellData,$name,$format){
ini_set('memory_limit','500M');
set_time_limit(0);//设置超时限制为0分钟
for($i=0;$i<count($cellData);$i++){
$cellData[$i] = array_values($cellData[$i]);
$cellData[$i][0] = str_replace('=',' '.'=',$cellData[$i][0]);
//判断是否有字段过长,如身份证号会显示科学计数法
for($j=0;$j<count($cellData[$i]);$j++){
if(strlen($cellData[$i][$j])>15){
$cellData[$i][$j]="\t".$cellData[$i][$j]."\t";
* 如果你要导出csv或者xlsx文件,只需将 export 方法中的参数改成csv或xlsx即可。
* 如果还要将该Excel文件保存到服务器上,可以使用 store 方法:
Excel::create(iconv('UTF-8', 'GBK', $name),function($excel) use ($cellData){
$excel->sheet('报名信息', function($sheet) use ($cellData){
四、导入Excel文件
我们将刚才保存到服务器上的Excel文件导入进来,导入很简单,使用Excel
门面上的load
方法即可:
//Excel文件导入功能 By Laravel学院
public function import(){
$filePath = 'storage\exports/'.iconv('UTF-8', 'GBK', '模板文件').'.xls';
Excel::load($filePath, function($reader) {
然后在浏览器中访问http://laravel.app:8000/api/excel/import