环境
框架版本:7.0;
laravel-excel版本:3.1;
介绍
LaravelExcel
旨在成为 Laravel
风格的 PhpSpreadsheet
。围绕 PhpSpreadsheet
的简单但优雅的包装,其目标是简化导出和导入。
安装
composer require maatwebsite/excel
手动注册
将 ExcelServiceProvider
添加到 config/app.php
'providers' => [
/*
* Package Service Providers...
*/
Maatwebsite\Excel\ExcelServiceProvider::class,
]
手动添加Excel门面
添加 Facade
在 config/app.php
'aliases' => [
...
'Excel' => Maatwebsite\Excel\Facades\Excel::class,
]
发布配置
php artisan vendor:publish --provider="Maatwebsite\Excel\ExcelServiceProvider" --tag=config
这将创建一个名为的新配置文件
config/excel.php
导出用法
创建导出类
php artisan make:export UsersExport
表头设置
导出类要实现
WithHeadings
这个接口
use Maatwebsite\Excel\Concerns\WithHeadings;
... ...
/**
* 添加标题行
* @return array|string[]
*/
public function headings(): array
{
return [
'主键ID',
'名称',
'年龄',
'创建时间',
'修改时间',
];
}
表标题设置
导出类要实现
WithTitle
这个接口
use Maatwebsite\Excel\Concerns\WithTitle;
... ...
public function title(): string
{
return '汇总总表';
}
单元格样式设置
导出类要实现
WithStyles
这个接口
use Maatwebsite\Excel\Concerns\WithStyles;
... ...
public function styles(Worksheet $sheet)
{
// 冻结行
$sheet->freezePaneByColumnAndRow('1','2');
// 合并单元格
$sheet->mergeCells('A1:F1');
// 单元格内容居中并换行
$sheet->getStyle('A:B')->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER)->setWrapText(true);
// 设置字体颜色和背景色
$sheet->getStyle('A1:J1')->applyFromArray([
'font' => [
'name' => '宋体',
'bold' => true,
'italic' => false,
'strikethrough' => false,
'color' => [
'rgb' => 'FFFFFF'
]
],
'fill' => [
'fillType' => 'linear', //线性填充,类似渐变
'rotation' => 45, //渐变角度
'startColor' => [
'rgb' => '34A8E7' //初始颜色
],
//结束颜色,如果需要单一背景色,请和初始颜色保持一致
'endColor' => [
'argb' => '34A8E7'
]
]
]);
}
列文本格式设置
导出类要继承
DefaultValueBinder
这个父类
use PhpOffice\PhpSpreadsheet\Cell\DefaultValueBinder;
... ...
public function bindValue(Cell $cell, $value)
{
$column = $cell->getColumn();
if (in_array($column, ['D', 'E'])) {
$cell->setValueExplicit($value, DataType::TYPE_STRING);
return true;
}
return parent::bindValue($cell, $value);
}
列宽设置
导出类要实现
WithColumnWidths
这个接口
use Maatwebsite\Excel\Concerns\WithColumnWidths;
... ...
public function columnWidths(): array
{
return [
'A' => 10,
'C' => 10,
'D' => 35,
'H' => 10,
'I' => 10,
'J' => 25,
];
}
源码示例
<?php
namespace App\Exports;
use App\Model\User;
use Maatwebsite\Excel\Concerns\FromArray;
use Maatwebsite\Excel\Concerns\ShouldAutoSize;
use Maatwebsite\Excel\Concerns\WithColumnWidths;
use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Concerns\WithStyles;
use PhpOffice\PhpSpreadsheet\Cell\Cell;
use PhpOffice\PhpSpreadsheet\Cell\DataType;
use PhpOffice\PhpSpreadsheet\Cell\DefaultValueBinder;
use PhpOffice\PhpSpreadsheet\Style\Alignment;
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
class UsersExport extends DefaultValueBinder implements WithHeadings,WithColumnWidths,WithStyles,ShouldAutoSize,FromArray
{
/**
* 添加标题行
* @return array|string[]
*/
public function headings(): array
{
return [
'主键ID',
'名称',
'年龄',
'创建时间',
'修改时间',
'新增列数据'
];
}
/**
* 列文本格式设置
* @param Cell $cell
* @param mixed $value
* @return bool
* @throws \PhpOffice\PhpSpreadsheet\Exception
*/
public function bindValue(Cell $cell, $value)
{
$column = $cell->getColumn();
$cell->setValueExplicit($value, DataType::TYPE_STRING);
return parent::bindValue($cell, $value);
}
/**
* 列宽设置
* @return array|int[]
*/
public function columnWidths(): array
{
return [
'A' => 30,
'B' => 30,
'C' => 30,
'D' => 45,
'E' => 45,
'F' => 40
];
}
/**
* 单元格设置样式
* @param Worksheet $sheet
* @throws \PhpOffice\PhpSpreadsheet\Exception
*/
public function styles(Worksheet $sheet)
{
// 冻结行
$sheet->freezePaneByColumnAndRow('1','2');
// 合并单元格
$sheet->mergeCells('A6:C6');
$sheet->mergeCells('D6:F6');
// 单元格内容居中并换行
$sheet->getStyle('A:G')->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER)->setWrapText(true);
// 设置字体颜色和背景色
$sheet->getStyle('A1:F1')->applyFromArray([
'font' => [
'name' => '宋体',
'bold' => true, // 加粗
'italic' => false,
'strikethrough' => false,
'color' => [
'rgb' => 'FFFFFF'
]
],
'fill' => [
'fillType' => 'linear', //线性填充,类似渐变
'rotation' => 45, //渐变角度
'startColor' => [
'rgb' => '34A8E7' //初始颜色
],
//结束颜色,如果需要单一背景色,请和初始颜色保持一致
'endColor' => [
'argb' => '34A8E7'
]
]
]);
$sheet->getStyle('A6:F6')->applyFromArray([
'font' => [
'name' => '宋体',
'bold' => true,
'italic' => false,
'strikethrough' => false,
],
]);
}
/**
* 准备行
* @param $rows
* @return mixed
*/
public function prepareRows($rows)
{
foreach ($rows as $key => $value) {
$rows[$key]['test'] = '我是一条新增数据'. ($key + 1);
}
$rows[] = [
'A-C的合并标题',
'','','D-F的合并标题'
];
$rows[] = [
'新增行数据1','新增行数据2','新增行数据3','新增行数据4','新增行数据5','新增行数据6'
];
return $rows;
}
/**
* 使用数组
* @return array
*/
public function array(): array
{
return [
[
'id' => 1,
'name' => '张三',
'age' => 18,
'created_at' => '2022-03-01 10:00:00',
'updated_at' => '2022-03-01 10:00:00'
],
[
'id' => 2,
'name' => '李四',
'age' => 22,
'created_at' => '2022-03-01 10:00:00',
'updated_at' => '2022-03-01 10:00:00'
],
[
'id' => 3,
'name' => '王二',
'age' => 28,
'created_at' => '2022-03-01 10:00:00',
'updated_at' => '2022-03-01 10:00:00'
],
[
'id' => 4,
'name' => '麻子',
'age' => 20,
'created_at' => '2022-03-01 10:00:00',
'updated_at' => '2022-03-01 10:00:00'
],
];
//return User::query()->get()->toArray();
}
}
调用
<?php
namespace App\Http\Controllers;
use App\Exports\UsersExport;
use Maatwebsite\Excel\Facades\Excel;
class TestController extends Controller
{
public function index()
{
return Excel::download(new UsersExport(), 'users.xlsx');
// 存储在磁盘
//- 默认磁盘
// return Excel::store(new UsersExport(), 'users.xlsx');
//- 自定义磁盘
// return Excel::store(new UsersExport(), 'users.xlsx','public');
//- 磁盘选项 用于传递参数
// return Excel::store(new UsersExport(), 'users.xlsx','public',null, ['visibility' => 'private',]);
//-- 私有文件的快捷写法
return Excel::store(new UsersExport(), 'users.xlsx','public',null, 'private');
}
}
导入用法
创建导入类
php artisan make:import UsersImport --model=User
UsersImport
导入类文件内容,如下:
<?php
namespace App\Imports;
use App\Model\User;
use Maatwebsite\Excel\Concerns\ToModel;
class UsersImport implements ToModel
{
/**
* @param array $row
*
* @return \Illuminate\Database\Eloquent\Model|null
*/
public function model(array $row)
{
return new User([
'name' => $row[1],
'age' => $row[2],
]);
}
}
调用
<?php
namespace App\Http\Controllers;
use App\Imports\UsersImport;
use Maatwebsite\Excel\Facades\Excel;
class TestController extends Controller
{
public function index()
{
Excel::import(new UsersImport(), public_path('storage/users.xlsx'));
return view('test');
}
}
特别感谢
参考博客: