Laravel Excel 实现 Excel-CSV 文件导入导出功能
Posted 子钦加油
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Laravel Excel 实现 Excel-CSV 文件导入导出功能相关的知识,希望对你有一定的参考价值。
Laravel Excel 是一款基于 phpExcel 开发的Laravel框架专用的 Excel/CSV 文件导入导出功能的扩展包,用起来的非常方便。
它的 Github 地址是:https://github.com/Maatwebsite/Laravel-Excel
安装
我们就按照GIthub上的readme文件进行安装吧。
composer require "maatwebsite/excel:~2.1.0"
在 config/app.php 中注册服务提供者到 providers 数组:
Maatwebsite\\Excel\\ExcelServiceProvider::class,
在 config/app.php 中注册门面到 aliases 数组:
\'Excel\' => Maatwebsite\\Excel\\Facades\\Excel::class,
生成 Laravel Excel 的配置文件,使用如下命令:
php artisan vendor:publish --provider="Maatwebsite\\Excel\\ExcelServiceProvider"
然后你会发现在 config 目录下有一个 excel.php 文件 ,大概的配置项,主要就是缓存,表单,和导入,导出的一些设置。
导出文件
我待会直接拿我的测试代码进行展示,不过在这之前你需要一条路由和一个控制器(一个导出方法)
//Excel导出 Route::get(\'/excel/export\',\'Member\\MemberController@export\')->name(\'/excel/export\'); //Excel导入 Route::get(\'/excel/import\',\'Member\\MemberController@import\')->name(\'/excel/import\');
创建控制器,可以使用 artisan 命令或者手动创建:
php artisan make:controller 控制器名称
导出方法:
<?php namespace App\\Http\\Controllers\\Member; use App\\Http\\Controllers\\BaseController; use App\\Model\\Member\\MemberFollow; use Illuminate\\Http\\Request; use Illuminate\\Database\\QueryException; use Excel; class MemberController extends BaseController { /** * * Excel导出 */ public function export() { ini_set(\'memory_limit\',\'500M\'); set_time_limit(0);//设置超时限制为0分钟 $cellData = MemberFollow::select(\'xt_name\',\'sex\',\'face\')->limit(5)->get()->toArray(); $cellData[0] = array(\'昵称\',\'性别\',\'头像\'); for($i=0;$i<count($cellData);$i++){ $cellData[$i] = array_values($cellData[$i]); } //dd($cellData); Excel::create(\'用户信息\',function($excel) use ($cellData){ $excel->sheet(\'score\', function($sheet) use ($cellData){ $sheet->rows($cellData); }); })->export(\'xls\'); die; } }
我来对上面的代码进行解释下。
a. ini_set 设置内存溢出大小和超时时间是因为我的数据量比较大,不想直接去 php.ini 中修改,所以直接在这设置。你也可以修改 excel.php 配置项中的缓存大小,适当调整。
b. 首先你得需要知道 cellData 是一个二维数组,并且二维数组中的每一个一维数组必须是索引数组才行,这样格式上才能正确。
所以,我对我查询出的 $cellData 先进行了 toArray() 转化操作。然后我让你看下查询出的结构,因为我们数组表中的每个列都是一个字段,所以决定了一维数组是关联数组,需要去键处理。
for 循环处理后就是:
如果你要导出 csv 或者 xlsx 文件,只需将 export 方法中的参数改成 csv 或 xlsx 即可。也可以进行连贯操作直接将导出的文件直接保存到服务器上。
使用 store 方法:
Excel::create(\'用户信息\',function($excel) use ($cellData){ $excel->sheet(\'score\', function($sheet) use ($cellData){ $sheet->rows($cellData); }); })->store(\'xls\')->export(\'xls\');
导入 Excel 文件
导入我们可以直接用第一步注册的门面 Excel 门面上的 load 方法
public function import(Request $request) { if(!$request->hasFile(\'question_file\')){ exit(\' 操作有误,请重新上传!\'); } $file = $_FILES; $excel_file_path = $file[\'question_file\'][\'tmp_name\']; Excel::load($excel_file_path, function($reader) { $data = $reader->toArray(); $question_data = []; foreach($data[0] as $key=>$val){ if(($val[\'tx\']) == 2){ $option = [\'A\'=>$val[\'a\'],\'B\'=>$val[\'b\']]; }else{ $option = [\'A\'=>$val[\'a\'],\'B\'=>$val[\'b\'],\'C\'=>$val[\'c\']]; } $question_data[] =[ \'cid\' =>intval($val[\'cid\']), //用取整函数 intval(11.0) 结果:11 \'title\' => $val[\'title\'], \'option\' => serialize($option), \'answer\' => $val[\'answer\'], \'score\' => intval($val[\'score\']), \'status\' =>intval($val[\'status\']), \'time\' =>time(), \'tx\' =>intval($val[\'tx\']) ]; } dd($question_data); }); }
以上代码是我在本地环境做测试时写的,功能虽然实现了但是写得不够严谨,未做任何数据验证!
foreach 循环处理后就是:
参考文章:
Laravel Excel 实现 Excel/CSV 文件导入导出功能:
https://blog.csdn.net/gu_wen_jie/article/details/79296470
在Laravel5中使用LaravelExcel实现Excel/CSV文件导入导出功能(PHPExcel):
http://blog.023xs.cn/Article/52
以上是关于Laravel Excel 实现 Excel-CSV 文件导入导出功能的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 5使用Laravel Excel实现Excel/CSV文件导入导出的功能详解
Laravel Excel 实现 Excel-CSV 文件导入导出功能