Laravel Excel 实现 Excel/CSV 文件导入导出功能

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gu_wen_jie/article/details/79296470

1.Laravel Excel

Laravel Excel 是一款基于PHPExcel开发的Laravel框架专用的Excel/CSV 文件导入导出功能的扩展包,用起来的非常方便。
它的Github地址是:https://github.com/Maatwebsite/Laravel-Excel
当然了,你也可以使用PHPExcel,但是请注意,PHPExcel官方团队已经停止维护了,现在官方团队开发维护的是它的升级版PHPExcel扩展包,叫做:PhpSpreadsheet
我们今天主要介绍(因为我前天项目中用到了导出,最后选择了Laravel Exxcel☺):Laravel Excel

2.安装

建议:在你安装使用每一款扩展包的时候请仔细看一下作者或者官方的说明文档,比如Github上的readme文件,大多数都是英文,看不懂没关系,一些关键字眼能看明白就行。你如对PHP版本的要求,Mysql版本的要求等等。。。
比如:
这里写图片描述

我们就按照GIthub上的readme文件进行安装吧。

  1. 首先在Laravel项目根目录下使用Composer安装依赖:

    composer require "maatwebsite/excel:~2.1.0"
  2. 在config/app.php中注册服务提供者到providers数组:

    Maatwebsite\Excel\ExcelServiceProvider::class,
  3. 在config/app.php中注册门面到aliases数组:

    'Excel' => Maatwebsite\Excel\Facades\Excel::class,
  4. 建议你生成Laravel Excel的配置文件,使用如下命令:

    php artisan vendor:publish --provider="Maatwebsite\Excel\ExcelServiceProvider"

    然后你会发现在config目录下有一个excel.php文件
    你可以打开看一下大概的配置项,主要就是缓存,表单,和导入,导出的一些设置。

    3.导出文件

    我待会直接拿我的测试代码进行展示,不过在这之前你需要一条路由和一个控制器(一个导出方法)

  5. 创建两个路由:

    //Excel导出
    Route::get('/excel/export','Member\MemberController@export')->name('/excel/export');
    //Excel导入
    Route::get('/excel/import','Member\MemberController@import')->name('/excel/import');
  6. 创建控制器,可以使用artisan命令或者手动创建:

    php artisan make:controller 控制器名称
  7. 导出方法:

<?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]);
            $cellData[$i][0] = str_replace('=',' '.'=',$cellData[$i][0]);
        }
        //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循环处理后就是:
这里写图片描述
c. for循环中的另一个
php
$cellData[$i][0] = str_replace('=',' '.'=',$cellData[$i][0]);

这个地方是比较坑的一个地,因为Excel单元格当你的导出数据中某个列的某个值第一个字符是等号“=”,他就会进行计算处理,然后就报错了。比如我到处的某个昵称是“=阳光”,我就吧等号匹配替换为空格加等号了
其实本不需要进行匹配替换的,因为在excel.php文件中有配置项,但是我配置了并不生效,后续找到更好的解决方法会及时更新,或者有哪位知道了可以指点一下。

 /*
        |--------------------------------------------------------------------------
        | Calculate
        |--------------------------------------------------------------------------
        |
        | By default cells with formulas will be calculated.
        |
        */

        'calculate'               => false,

默认情况下,计算公式的单元格将被计算。我设置为false没生效。所以匹配替换。

如果你要导出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');

ok,导出完成。

4.导入文件

导入我们可以直接用第一步注册的门面Excel门面上的load方法

/**
     *
     * Excel导入
     */
    public function import(){
        $filePath = 'storage/exports/'.iconv('UTF-8', 'GBK', '用户信息').'.xls';
        Excel::load($filePath, function($reader) {
            $data = $reader->all();
            dd($data);
        });
    }

一个简单的操作就完成了,这个插件使用起来挺不错的。上方出现的问题,解决的或者有问题的请留言。

展开阅读全文

没有更多推荐了,返回首页