首先下载,在命令行中
composer require maatwebsite/excel
然后在项目中配置:
在app/config/app.php配置文件中
providers数组添加Maatwebsite\Excel\ExcelServiceProvider::class,
如下图1;
aliasses数组中添加'Excel' => Maatwebsite\Excel\Facades\Excel::class,
如下图2;
图1:
图2:
下面我把方法都提了出来
控制器前面一定use这个Excel;
use Maatwebsite\Excel\Facades\Excel;
上传文件调用的方法:
private function upload_data(Request $request)//导入的时候 上传文件
{
if (!$request->hasFile('file')) {
return [
'success' => false,
'message' => '上传文件为空'
];
}
$file = $request->file('file');
if (!$file->isValid()) {
return [
'success' => false,
'message' => '文件上传出错'
];
}
$extension = $file->getClientOriginalExtension();
$storage_path = storage_path('app/public/excel');//上传文件保存的路径
if (!file_exists($storage_path)) {//如果$storage_path(文件保存的目录)不存在
mkdir($storage_path, 0777, true);//创建一个目录
}
$filename = md5(millisecond()) . '.' . $extension;//文件名
if ($file->move($storage_path, $filename) == false) {//移动一个已上传的文件
return [
'success' => false,
'message' => '文件保存失败'
];
}
return [//上传成功返回文件名称
'success' => true,
'message' => $filename
];
}
给上传的文件按照时间戳命名时调用的方法:
function millisecond()
{
return ceil(microtime(true) * 1000);
//ceil() 函数向上舍入为最接近的整数 microtime()返回当前 Unix 时间戳的微秒数:当设置为 TRUE 时,规定函数应该返回浮点数,否则返回字符串。默认为 FALSE。
}
文件上传成功后读取文件数据时调用的方法:
private function load_excel($filename)
{
$filePath = 'storage/app/public/excel/' . $filename;
$reader = Excel::load($filePath);//要开始导入文件,可以使用->load($filename)。回调是可选的。
$reader = $reader->getSheet(0);//得到Excel的第一页内容,如下图3
return $reader->toArray();
}
图3:
导入文件方法:
如果部分数据导入失败,把这部分失败数据存起来,存到session里面,然后返回给前台一个标识信息,前台收到信息后调用下面的err_download()方法,去session里面把这部分数据下载下来。
public function import(Request $request)
{
$time_star = time();//得到当前时间戳,用来在最后计算文件导入完毕后的用时
//set_time_limit — 设置脚本最大执行时间。默认值为30秒,或者是在php.ini的max_execution_time被定义的值,如果此值存在。如果设置为0(零),没有时间方面的限制。
$rlt = $this->upload_data($request);//调用上面的方法,上传文件得到文件名
if ($rlt["success"] == false) {
return Response::json($rlt);
} else {
try {
$data = [];
$table = $this->load_excel($rlt["message"]);//调用load_excel方法导入文件
if ($table[0][0] == "姓名" && $table[0][1] == "就职单位" && $table[0][2] == "联系电话" ) {//Excel第一行
$title = [
0 => '姓名',
1 => '就职单位',
2 => '联系电话',
];
foreach ($table as $v) {
try{
if ($v[0] == "姓名" && $v[1] == "就职单位" && $v[2] == "联系电话") {
continue;
}
if ($v[0] == "" && $v[1] == "" && $v[2] == "") {
} else {
$row["name"] = trim($v[0]);//姓名
$row["address"] = trim($v[1]);//就职单位
$row["phone"] = trim($v[2]);//联系电话
array_push($data, $row);
}
}catch(\Exception $e){
$err_count++;
array_push($error,$v);//失败数据存起来后面将把失败数据导出
Log::info($e);
continue;
}
}
//插入
foreach($data as $d){
if(!$d)continue;
try{
DB::transaction(function ()use($d,$process_template) {//一些导入操作
$insert_id = DB::table("student")->insertGetId($d);
//一些数据库操作
});
$success_count++;
}catch (\Exception $e){
$err_count++;
array_push($error,$d);//失败数据存起来后面将把失败数据导出
continue;
}
}
if($error){
array_unshift($error,$title);//将标题插入失败数据的第一行,后面导出
session(['error'=>$error]);//将要导出的内容存入session 键值为error
$download = true;//向前台返回一个标识,true说明有失败数据
}else{
$download = false;
}
$time_end = time();
return Response::json(["success" => true, "message" => "本次共导入 ".($success_count+$err_count).' 条数据 , 其中失败 '.$err_count.' 条 。 ','download'=>$download,'time'=>($time_end-$time_star)]);
} else {
return Response::json(["success" => false, "message" => "数据格式错误"]);
}
} catch (\Exception $e) {
Log::info($e);
return Response::json(["success" => false, "message" => "数据导入失败"]);
}
}
}
导入成功后前台执行的方法,访问admin/exam/download_err下载失败数据:
success(res) {
if(res.download){//后台传过来的一个标识,true说明有失败数据,将失败数据导出
location.href = 'admin/exam/download_err';
}
}
访问admin/exam/download_err需要配置路由信息:
//下载失败数据表格
Route::get('/exam/download_err','Admin\ExamController@err_download');//根据自己的控制器进行更改
下面是导出失败数据的方法,从session中将失败数据导出来:
function err_download(){
$err = session()->pull('error');//得到session中error对应的数据
if($err){
Excel::create('导入失败数据',function($excel) use($err){
$excel->sheet('列表', function($sheet) use($err) {
$sheet->rows($err);
})->download('xls');
});
}
}
下面是数据导出功能:
还是要先配置路由信息
location = 'admin/student/export';
//导出表格对应的路由信息
Route::get('student/export', 'Admin\StudentController@export');
导出数据调用的方法,从数据库里面得到数据,将数据组织成Excel格式导出。
public function export(Request $request){//导出数据
$data = DB::table('student')->where('status',1)->get()->toArray();//通过查询得到数据
$title = [
0 => '姓名',
1 => '就职单位',
2 => '联系电话',
];
$export = null;
foreach ($data as $key => $val) {
$export[$key][0] = $val->name;
$export[$key][1] = $val->address;
$export[$key][2] = $val->phone;
}
$data = array_merge($title,$export);
Excel::create('学员列表_'.date('Y-m-d H:i:s'),function($excel) use($data){
$excel->sheet('学员列表', function($sheet) use($data) {
$sheet->setWidth(array(
'A' => 10,
'B' => 15,
'C' => 20,
));
$sheet->rows($data);
});
})->export('xls');
}
成长路上的一些知识分享,如有错误,欢迎指正批评!O(∩_∩)O