使用Laravel Excel的一些感受

  • 2019-03-07
  • 0
  • 2

最近由于项目需要导出及导入excel文件操作,于是脑子里想到的第一个是PHPExcel库,之前也是一直用的是这个库,操作起来虽然简单但不够优雅,毕竟现在项目用的是最优雅的PHP框架Laravel(不服来辩,哈哈),所以得找一个与之相配的扩展库。

起初在Gayhub上找到了phpoffice/phpspread扩展,功能很是强大,简直深得我心,就在我选定它的时候,意外让我看到了maatwebsite/LaravelExcel,这个看起来才是与laravel最配的一个库,性能这块我们暂时不考虑哈。

安装按照文档基本不会有什么问题,这里就不细说了,详情请看文档。使用起来导出还是相对简单,跟着文档就行,因为导入文档比较复杂,在这里耗了将近整整一天,表示有点晕,各位大神勿笑。

1.导出
导出方式可以选择很多种,具体可以参照文档,我就把这次我用的方式贴出来,使用的是数组方式。

首先建立数据接收方法

<?php

namespace App\Exports;

use Maatwebsite\Excel\Concerns\FromArray;
use Maatwebsite\Excel\Concerns\WithHeadings;

class LogExport implements FromArray, WithHeadings
{
    protected $data;

    public function __construct(array $data)
    {
        $this->data = $data;
    }

    public function array(): array
    {
        return $this->data;
    }

    public function headings(): array
    {
        return [
            '料件号',
            '商品名称',
            '数量',
            '出/入库',
            '日期',
            '关联单号',
            '备注'
        ];
    }
}

然后在控制器调用

Excel::download(new LogExport($exportData), $filename.'.xlsx');

说明

$exportData为导出的数组数据,$filename为文件名

导出是不是看起来很简单。

2.导入

导入这块确实耗了我不少时间,也看了好几遍文档才弄明白,
在开始使用时总是报内存不够,建议增加内存,然后查了一下博客,只要在调用前添加

ini_set(‘memory_limit’, ‘-1’);

就可以解决。

导入简单的excel文件还是没什么难度的,但是我导入的excel是多个sheet以及每个sheet的数据是不规则的,并不能使用循环来处理,
而且每个页面的数据要保存在多个表中,而且不同sheet的内容保存时相互依赖的,后面sheet内容要保存前面内容的主键ID,
所以开始试了好多种方法都不行。

开始想到的是WithMultipleSheets方式,分别处理每个sheet内容,但是我的需求是后一个sheet保存要拿到前一个sheet保存后的主键ID, 就在这里郁闷了好久,也试了很多方式都不行。

后来试了mapping、collection都不行。

最后想想为什么不自己拿到数组处理呢,就看了文档的方法

看起来也挺容易,在toArray中传入文件即可

像我这样,传了文件路径,试了好多遍可是一直保toArray给的参数不对,但是点开方法看是这样啊

然后又去看文档,找文章,通过不断尝试原来是这样操作

要传整个获取的文件进去才能返回整个excel的文件。

这个是使用数组的形式接收,记住一定要使用 Importtable方法,否则会报错。

由于时间问题就先写到这吧,有什么可以进行讨论。

 

评论

  • 朕书山压力大回复

    老哥,没有了嘛,难得看到一个同样的问题