Laravel中使用Laravel Excel 实现Excel文件导入导出

原文链接:http://laravelacademy.org/post/2024.html

GitHub地址:https://github.com/Maatwebsite/Laravel-Excel

一、安装

根目录下安装依赖

composer require maatwebsite/excel ~2.0.0

安装成功之后

发现composer.json文件里的"require"多了一行:

"maatwebsite/excel": "~2.1.0",

还有vendor目录下面多了一个maatwebsite的文件夹

二、配置

config/app.php中注册服务提供者到providers数组:

Maatwebsite\Excel\ExcelServiceProvider::class,

同样在config/app.php中注册门面到aliases数组:

'Excel' => Maatwebsite\Excel\Facades\Excel::class,

如果想要对Laravel Excel进行更多的自定义配置,执行以下命令:

php artisan vendor:publish

执行成功后会在config目录下生成一个配置文件excel.php可以自行修改excel的配置信息

三、导出Excel文件

执行

php artisan make:controller ExcelController 

生成一个Excel的控制器

并在routes/api.php里添加路由信息

Route::get('excel/export','ExcelController@export');
Route::get('excel/import','ExcelController@import');

然后在ExcelController 里定义export文件导出方法

sheet('score', function($sheet) use ($cellData){
            $sheet->rows($cellData);
        });
    })->store('xls')->export('xls');
}
iconv('UTF-8', 'GBK', '模板文件'),function($excel) use ($cellData){
        $excel->sheet('score', function($sheet) use ($cellData){
            $sheet->rows($cellData);
        });
    })->store('xls')->export('xls');
}
 

我们在浏览器中访问http://laravel.app:8000/api/excel/export,会导出一个名为模板文件.xls的Excel文件

如果你要导出csv或者xlsx文件,只需将export方法中的参数改成csv或xlsx即可。

如果在windows上反倒不需要加iconv('UTF-8', 'GBK', '模板文件')就可以正常输出中文不会乱码,linux上面必须设置转码

在这里被坑了一把,一开始直接参照模板来,没有在export导出方法里改那个iconv

然后直接在import里直接套用的里面带有iconv的导入方法,然后一直报一个

Notice: iconv() [function.iconv]: Detected an illegal character in input string ...

这样的错误,然后按照网上的各种方法也改了,也还是没用,然后最后是先把export里的文件在创建的时候就要跟import里的一样用iconv,在下面导入Excel的时候才不会报那个错误。。。。

如果是要把数据库里的某个表或者某两个表的数据用excel导出而且还可以自己控制筛选条件,并且是和前端进行对接,我的做法是直接把文件导出保存在服务器,返回返回前端可以下载此文件的url地址。进行了如下尝试,也可以很好的满足我的需求。

比如

在service层写一个筛选数据源的方法

 public static function  beforeExportExcel($data){

        $cellData =Train::whereHas('TrainSignup', function ($query) {
            $query->where('audit_status', '=', 1);
        })
            ->where('del_flag',0)
            ->select('name', 'id_no', 'mobile');
        if(isset($data['train_class_id'])){
            $cellData->where('train_class_id',$data['train_class_id']);
        }
        $cellData=$cellData->get()->toArray();
        $cellData1 = array('姓名','身份证号','移动电话');
        array_unshift($cellData, $cellData1);

        return $cellData;
    }

 在controller层

    public function export(Request $request)
    {
        $data = $request->json()->all();
        $this->validate($request, [

        ]);
//设置文件格式 默认xls
        $format=isset($data['format'])?$data['format']:'xls';
//设置文件名称 默认xxx
        $name=isset($data['table_name'])?$data['table_name']:'xxx';

//调用刚刚在service层写的获取数据源的方法
        $response= xxxService::beforeExportExcel($data);

//设置保存文件的文件夹路径 如果没有则新建
        $resource_path='/storage/uploads/file/';
        $file_path =public_path().$resource_path.date('Y').'/'.date('m').'/'.date('d');
        if (!is_dir($file_path)){
            mkdir($file_path,0775, true);
        }

//调用公共方法导出保存excel文件
        ExcelController::export($response,$name,$format);

//将可以访问到文件的url返回给前端
        $domain =Config::get('app.domain');
        $url =$domain.$resource_path.date('Y').'/'.date('m').'/'.date('d').'/'.$name.'.'.$format;

        $ret = RetObject::genSuccess('导出成功',$url);
        return response()->json($ret);

    }

在这里设置了文件的保存路径,注意在再上面config目录下生成的excel.php文件中,找到store的path修改为跟上面一致的路径 

       'store'                       => [

            /*
            |--------------------------------------------------------------------------
            | Path
            |--------------------------------------------------------------------------
            |
            | The path we want to save excel file to
            |
            */
            'path'       => public_path().'/storage/uploads/file/'.date('Y').'/'.date('m').'/'.date('d'),


            /*
            |--------------------------------------------------------------------------
            | Return info
            |--------------------------------------------------------------------------
            |
            | Whether we want to return information about the stored file or not
            |
            */
            'returnInfo' => false

        ],

新建一个类,写一个导出保存excel的公共方法

   class ExcelController extends Controller
{
     public static function export($cellData,$name,$format){

        ini_set('memory_limit','500M');
        set_time_limit(0);//设置超时限制为0分钟

        for($i=0;$isheet('报名信息', function($sheet) use ($cellData){
                $sheet->rows($cellData);
            });
        })->store($format);

    }
}

四、导入Excel文件

我们将刚才保存到服务器上的Excel文件导入进来,导入很简单,使用Excel门面上的load方法即可:

//Excel文件导入功能 By Laravel学院
public function import(){
    $filePath = 'storage\exports/'.iconv('UTF-8', 'GBK', '模板文件').'.xls';
    Excel::load($filePath, function($reader) {
        $data = $reader->all();
        dd($data);
    });
}

然后在浏览器中访问http://laravel.app:8000/api/excel/import

你可能感兴趣的:(PHP-Laravel)