总结了一下 3.1 版本步骤
附上官方文档地址
laravel-excel/maatwebsite/excel 文档
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地址
例:
# php artisan make:import CommonImport --model=Models/Common
此操作会在 app / 下创建一个 Import 目录并创建一个文件
├── app
│ ├── Imports
│ │ ├── CommonImport.php
│
└── composer.json
App\Imports\CommonImport.php 代码如下
<?php
namespace App\Imports;
use App\Models\Models\Common;
use Maatwebsite\Excel\Concerns\ToModel;
class CommonImport implements ToModel
{
/**
* @param array $row
*
* @return \Illuminate\Database\Eloquent\Model|null
*/
public function model(array $row)
{
return new Common([
//
]);
}
}
控制器调用
<?php
namespace App\Http\Controllers;
use App\Fulfill\CommonFulfill;
use Illuminate\Http\Request;
use App\Imports\CommonImport;
use Maatwebsite\Excel\Facades\Excel;
class CommonController extends Controller
{
public function import(Request $request)
{
@ini_set('memory_limit', '2G');
if ($request->hasFile('file')) {
$file = $request->file('file');
//转为数组
$result = Excel::toArray(new CommonImport, $file);
//转为对象
$result = Excel::toCollection(new CommonImport, $file);
dd($result);
}
}
}
打印结果如下
导出
1. 新建一个导出文件
php artisan make:export CommonExport
此操作会在 app / 下创建一个 Export 目录并创建一个 CommonExport.php 文件
.
├── app
│ ├── Exports
│ │ ├── CommonExport.php
│
└── composer.json
CommonExport.php 内
<?php
namespace App\Exports;
use Maatwebsite\Excel\Concerns\WithStyles;
use Maatwebsite\Excel\Concerns\FromCollection;
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
class CommonExport 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');