maatwebsite/excel3.1 导入/导出Excel
最近用了maatwebsite/excel的导入,找了很多文章都是2.1的,总结了一下3.1版本步骤
附上官方文档地址
laravel-excel/maatwebsite/excel文档
下面来说一下具体步骤,因为我只用到了ToCollection,所以就说下这个,后续有用到了会继续更新
1.安装composer包
composer require maatwebsite/excel
laravel9使用这个安装
composer require psr/simple-cache:^2.0 maatwebsite/excel
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"
导入
1.新建一个导入文件
php artisan make:import 文件名称 --model=Model地址
此操作会在app/下创建一个Import目录并创建一个文件
.
├── app
│ ├── Imports
│ │ ├── CompanyUserImport.php
│
└── composer.json
我这里需要导入的数据需要自己处理一下,所以使用的ToCollection的方法
app/Import/CompanyUserImport.php代码如下
<?php
namespace App\Imports;
use App\Models\Company\CompanyUserModel;
use Maatwebsite\Excel\Concerns\ToCollection;
use Illuminate\Support\Collection;
class CompanyUserImport implements ToCollection
{
/**
* 使用 ToCollection
* @param array $row
*
* @return User|null
*/
public function collection(Collection $rows)
{
foreach ($rows as $row)
{
// dump($row);
// 处理数据
}
CompanyUserModelDB::insert($data);
}
public function createData($rows)
{
//todo
}
}
控制器调用
<?php
namespace App\Http\Controllers\Company;
use Illuminate\Http\Request;
use App\Imports\CompanyUserImport;
use App\Http\Controllers\Controller;
use Maatwebsite\Excel\Facades\Excel;
class CompanyUserController extends Controller
{
/**
* excel批量导入成员
*
* @param Request $request
* @return void
*/
public function importMember(Request $request)
{
Excel::import(new CompanyUserImport, request()->file('excelfile'));
}
}
附上app/Import/CompanyUserImport.php中collection方法里的dump效果
如果只需要把excel的内容拿出来自行做处理的话,只需把调用方式改为以下例子即可
//转为数组
$excelData = Excel::toArray(new CompanyUserImport, request()->file('excelfile'));
//转为对象
$excelData = Excel::toCollection(new CompanyUserImport, request()->file('excelfile'));
dd($excelData);
打印结果如下
导出
1.新建一个导出文件
php artisan make:export ExternalErrorReportExport
此操作会在app/下创建一个Export目录并创建一个ExternalErrorReportExport.php文件
.
├── app
│ ├── Exports
│ │ ├── ExternalErrorReportExport.php
│
└── composer.json
ExternalErrorReportExport.php内
<?php
namespace App\Exports;
use Maatwebsite\Excel\Concerns\WithStyles;
use Maatwebsite\Excel\Concerns\FromCollection;
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
class ExternalErrorReportExport implements FromCollection,WithStyles
{
private $row;
private $data;
public function __construct($row,$data)
{
$this->row = $row;
$this->data = $data;
}
public function collection()
{
$row = $this->row;
$data = $this->data;
//设置表头
foreach ($row[0] as $key => $value) {
$key_arr[] = $key;
}
//输入数据
foreach ($data as $key => &$value) {
$js = [];
for ($i=0; $i < count($key_arr); $i++) {
$js = array_merge($js,[ $key_arr[$i] => $value[ $key_arr[$i] ] ]);
}
array_push($row, $js);
unset($val);
}
return collect($row);
}
public function styles(Worksheet $sheet)
{
// 合并单元格
$sheet->mergeCells('A1:E1');
// 设置单元格的值
$sheet->getCell('A1')->setValue("填写须知:\n 1. 请勿修改表格结构;\n 2. 标红字段为必填项,黑色字段为选填项;");
// 设置字体颜色
$sheet->getStyle('A5')->getFont()->getColor()->setARGB(\PhpOffice\PhpSpreadsheet\Style\Color::COLOR_RED);
$sheet->getStyle('B5')->getFont()->getColor()->setARGB(\PhpOffice\PhpSpreadsheet\Style\Color::COLOR_RED);
$sheet->getStyle('F')->getFont()->getColor()->setARGB(\PhpOffice\PhpSpreadsheet\Style\Color::COLOR_RED);
// 设置背景色
$sheet->getStyle('A5:E5')->getFill()
->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)
->getStartColor()->setRGB('e9e9e9');
// 设置列宽
$sheet->getColumnDimension('A')->setWidth(20);
$sheet->getColumnDimension('B')->setWidth(20);
$sheet->getColumnDimension('C')->setWidth(20);
$sheet->getColumnDimension('D')->setWidth(30);
$sheet->getColumnDimension('E')->setWidth(20);
$sheet->getColumnDimension('F')->setWidth(20);
// 设置行高
$sheet->getRowDimension('1')->setRowHeight(100);
$sheet->getRowDimension('2')->setRowHeight(1);
$sheet->getRowDimension('3')->setRowHeight(1);
$sheet->getRowDimension('4')->setRowHeight(1);
// 设置默认行高
$sheet->getDefaultRowDimension()->setRowHeight(17);
// setWrapText自动换行,setVertical垂直对齐方式
$sheet->getStyle('A1')->getAlignment()->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_TOP)->setWrapText(true);
// 锁定单元格
$sheet->getProtection()->setSheet(true);
// 这里原本只想让这几个单元格不可编辑,但是不知道怎么就所有都不能编辑了,等找到更好的办法会再解决这里
$sheet->getStyle('A1:F5')->getProtection()->setLocked(\PhpOffice\PhpSpreadsheet\Style\Protection::PROTECTION_PROTECTED);
// 注意,这里要将可编辑的地方设为不受保护,不然整个excel都不能编辑了
$sheet->getStyle('A6:F150')->getProtection()->setLocked(\PhpOffice\PhpSpreadsheet\Style\Protection::PROTECTION_UNPROTECTED);
}
}
控制器内调用
// 获取缓存中的数据
$errorReport = Cache::get('company-import-member-error-' . $companyId);
//设置表头
$row = [
[
0 => "填写须知:\n 1. 请勿修改表格结构;\n 2. 标红字段为必填项,黑色字段为选填项;\n 3. 手机:必填,且在本企业内不可重复,支持国内手机号;\n 4. 部门:必填,上下级部门间使用「/」隔开,请从最上级部门(即您的公司名)开始填写,例如“上海新阅科技有限公司/新媒体部 \n ",
1 => null,2 => null,3 => null,4 => null,5 => null
],
[ 0 => null,1 => null,2 => null,3 => null,4 => null,5 => null],
[ 0 => null,1 => null,2 => null,3 => null,4 => null,5 => null],
[ 0 => null,1 => null,2 => null,3 => null,4 => null,5 => null],
[
0 => "姓名",
1 => "手机号",
2 => "邮箱",
3 => "部门",
4 => "职位",
5 => " ",
],
];
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.date('Y:m:d ') . '错误报告.xls');
header('Content-Transfer-Encoding: binary');
return Excel::download(new MemberErrorReportExport($row,$errorReport), date('Y:m:d ') . '错误报告.xls');
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: