laravel 导入/导出Excel

总结了一下 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');

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以使用PHPExcel库来实现在PHP Laravel框架导出多个sheet表。下面是一个简单的示例代码: ``` // 创建PHPExcel对象 $objPHPExcel = new PHPExcel(); // 创建第一个sheet表并设置标题 $objPHPExcel->setActiveSheetIndex(0); $objPHPExcel->getActiveSheet()->setTitle('Sheet1'); $objPHPExcel->getActiveSheet()->setCellValue('A1', 'Sheet1 Title'); // 创建第二个sheet表并设置标题 $objPHPExcel->createSheet(); $objPHPExcel->setActiveSheetIndex(1); $objPHPExcel->getActiveSheet()->setTitle('Sheet2'); $objPHPExcel->getActiveSheet()->setCellValue('A1', 'Sheet2 Title'); // 创建第三个sheet表并设置标题 $objPHPExcel->createSheet(); $objPHPExcel->setActiveSheetIndex(2); $objPHPExcel->getActiveSheet()->setTitle('Sheet3'); $objPHPExcel->getActiveSheet()->setCellValue('A1', 'Sheet3 Title'); // 导出Excel文件 $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); header('Content-Disposition: attachment;filename="example.xlsx"'); $objWriter->save('php://output'); ``` 在上面的示例中,我们首先创建了一个新的PHPExcel对象。然后使用setActiveSheetIndex()方法来切换到要创建的工作区,使用setTitle()方法设置工作区的标题,并使用setCellValue()方法设置工作区中的数据。最后,我们使用createWriter()方法将PHPExcel对象保存为Excel文件并输出到浏览器。您可以根据需要重复这个过程来创建更多的工作区。 请注意,此示例使用的是PHPExcel库,这是一个强大的PHP库,用于创建、读取和操作Excel文件。但是,PHPExcel项目已经停止维护,因此我建议您使用其他替代库,例如PhpSpreadsheet,它是PHPExcel的后继者。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值