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
‘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 文件導入導出功能