原文链接: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文件导出方法
sheet('score', function($sheet) use ($cellData){
$sheet->rows($cellData);
});
})->store('xls')->export('xls');
}
iconv('UTF-8', 'GBK', '模板文件'),function($excel) use ($cellData){
$excel->sheet('score', function($sheet) use ($cellData){
$sheet->rows($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);
})
->where('del_flag',0)
->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);
return $cellData;
}
在controller层
public function export(Request $request)
{
$data = $request->json()->all();
$this->validate($request, [
]);
//设置文件格式 默认xls
$format=isset($data['format'])?$data['format']:'xls';
//设置文件名称 默认xxx
$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);
}
//调用公共方法导出保存excel文件
ExcelController::export($response,$name,$format);
//将可以访问到文件的url返回给前端
$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修改为跟上面一致的路径
'store' => [
/*
|--------------------------------------------------------------------------
| Path
|--------------------------------------------------------------------------
|
| The path we want to save excel file to
|
*/
'path' => public_path().'/storage/uploads/file/'.date('Y').'/'.date('m').'/'.date('d'),
/*
|--------------------------------------------------------------------------
| Return info
|--------------------------------------------------------------------------
|
| Whether we want to return information about the stored file or not
|
*/
'returnInfo' => false
],
新建一个类,写一个导出保存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;$i15){
$cellData[$i][$j]="\t".$cellData[$i][$j]."\t";
}
}
}
// dd($cellData);
/*
* 如果你要导出csv或者xlsx文件,只需将 export 方法中的参数改成csv或xlsx即可。
* 如果还要将该Excel文件保存到服务器上,可以使用 store 方法:
*/
Excel::create(iconv('UTF-8', 'GBK', $name),function($excel) use ($cellData){
$excel->sheet('报名信息', function($sheet) use ($cellData){
$sheet->rows($cellData);
});
})->store($format);
}
}
四、导入Excel文件
我们将刚才保存到服务器上的Excel文件导入进来,导入很简单,使用Excel
门面上的load
方法即可:
//Excel文件导入功能 By Laravel学院
public function import(){
$filePath = 'storage\exports/'.iconv('UTF-8', 'GBK', '模板文件').'.xls';
Excel::load($filePath, function($reader) {
$data = $reader->all();
dd($data);
});
}
然后在浏览器中访问http://laravel.app:8000/api/excel/import