Laravel5.5安装使用Excel扩展
Laravel5.5安装使用Excel扩展
背景:自己在家学习laravel框架,需要使用excel导入导出功能,在安装laravel Excel相关扩展过程中出现很多问题,在此记录一下。
框架版本:laravel5.5,PHP:7.3,集成环境:xampp,系统:Windows10.
一、 composer镜像
在框架根目录下的 composer.json 文件底部可以看到当前 composer 使用的镜像来源:
但是https://packagist.phpcomposer.com
这个镜像凉了一半了,部分扩展程序没法通过composer下载,官方也不负责任也不通知下。我们改成阿里云镜像:https://mirrors.aliyun.com/composer/
。
二、 安装配置laravel Excel扩展
1.在Laravel项目根目录下使用Composer安装依赖:
composer require maatwebsite/excel ~2.1注:因为现在官方版本已经更新到3.X版本了,而2.X跟3.X版本不兼容!如果你不限制版本号的话,composer会安装最新的3.X版本!可能会不能正常运行,所以记得加上~2.1。
2.安装后,修改设置:
在config/app.php中注册服务提供者到providers数组:
Maatwebsite\Excel\ExcelServiceProvider::class,
在config/app.php中注册门面到aliases数组:‘Excel’ => Maatwebsite\Excel\Facades\Excel::class,
执行Artisan命令:
php artisan vendor:publish --provider=“Maatwebsite\Excel\ExcelServiceProvider”注:执行成功后会在config目录下生成文件excel.php。
3.修改生成的excel.php文件:
将’to_ascii’ => true,改为 ‘to_ascii’ => false,
三、 测试
到了学习Excel这一步的人都会创建控制器和定义路由了的,这里我不重复了,直接演示怎么使用。
(一)导出
1. 首先引入Excel
在 config/app.php 文件的 alias 数组里已经定义过 Excel 的别名,所以在控制器里直接引入Excel即可:
2. 然后实现导出功能
<?php
namespace App\Http\Controllers\Admin;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
// 引入 Excel
use Excel;
class QuestionController extends Controller
{
// 导出方法
public function export(){
$cellData = [
['学号','姓名','成绩'],
['10001','AAAAA','99'],
['10002','BBBBB','92'],
['10003','CCCCC','95'],
['10004','DDDDD','89'],
['10005','EEEEE','96'],
];
Excel::create('学生成绩', function($excel) use ($cellData){
$excel->sheet('score', function($sheet) use ($cellData){
$sheet->rows($cellData);
});
})->store('csv')->export('csv');
}
?>
一般情况下到了这一步就可以顺利导出Excel文件了,但我这个项目有有一点比较特别,那就是PHP版本过高,项目里用的是PHP7.3版本,此时访问export()方法会报错:
原因是在PHP7.3
的 switch 里面使用 continue
会出现警告,可以换成 break
或者 continue2
。只需要修改对应位置的代码就可以了。
此时执行导出功能就会直接下载Excel文件,如果你要导出csv或者xlsx文件,只需将export方法中的参数改成csv或xlsx。
store()方法,将该文件保存到服务器上,默认保存到storage/exports 目录下,iconv()是为了防止文件名中文乱码。
(二)导入
在 export函数里的store()方法可以保存Excel文件在服务器,此处我们直接使用这个文件演示导入功能。
文件路径:根目录/storage/exports/
public function import(){
$filePath = 'storage/exports/'.iconv('UTF-8', 'GBK', '学生成绩').'.xls';
Excel::load($filePath, function($reader) {
$data = $reader->all();
$data = json_decode($data);
dump($data);
});
exit;
}
load方法基于项目根路径作为根目录,同样我们对中文进行了转码,否则会提示文件不存在。当然,实际使用过程中导入功能一般是跟上传功能关联的,本教程不演示上传了,只需把 $filePath 替换成真实的文件路径就可以了,实际效果如下图所示: