Laravel Excel使用

环境

框架版本: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门面

添加 Facadeconfig/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');
    }
}

特别感谢

参考博客:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值