Laravel Excel 實現 Excel-CSV 文件導入導出功能

Laravel Excel 是一款基於 PHPExcel 開發的Laravel框架專用的 Excel/CSV 文件導入導出功能的擴展包,用起來的很是方便。 php

它的 Github 地址是:https://github.com/Maatwebsite/Laravel-Excel git

安裝github

咱們就按照GIthub上的readme文件進行安裝吧。web

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 文件 ,大概的配置項,主要就是緩存表單,和導入導出的一些設置。app

導出文件composer

我待會直接拿個人測試代碼進行展現,不過在這以前你須要一條路由和一個控制器(一個導出方法)框架

//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

相關文章
相關標籤/搜索