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效果

maatwebsite/excel3.1 导入Excel详解

如果只需要把excel的内容拿出来自行做处理的话,只需把调用方式改为以下例子即可

//转为数组
$excelData = Excel::toArray(new CompanyUserImport, request()->file('excelfile'));

//转为对象
$excelData = Excel::toCollection(new CompanyUserImport, request()->file('excelfile'));

dd($excelData);

打印结果如下
maatwebsite/excel3.1 导入Excel

导出

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 协议》,转载必须注明作者和本文链接
huliuwa
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 8

请问下,你这导出中文名称是对的吗

1年前 评论
huliuwa (楼主) 1年前
Eriksen

感谢 :thumbsup:

2个月前 评论

下不下来 net::ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION

2个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!