zoukankan      html  css  js  c++  java
  • laravel-excel导入导出

        安装 composer require maatwebsite/excel   注意3.0与2.0几乎完全不同的,文档也不同
        3.1文档: https://laravel-excel.maatwebsite.nl/3.1/getting-started/
        1.导出
            推荐导出文档: https://blog.csdn.net/beyond__devil/article/details/83008782
                        https://blog.csdn.net/u010324331/article/details/83658747
            构造类
                use AppExtensionsmyappModelsGoods;              //商品model
                use MaatwebsiteExcelConcernsFromCollection;      //excel表单字段集  必备
                use MaatwebsiteExcelConcernsWithHeadings;        //excel标题行
    
                class GoodsExport implements FromCollection, WithHeadings {
                    public function __construct($post) {// 如果需要的话可以通过构造函数传递参数
                        $this->post = [];
                        if(is_array($post) && count($post)>0) {
                            $this->post = $post;
                        }
                    }
                    public function collection() {
                        // return Goods::select('goods_name','price','stock')->get();// 查询数据直接返回
                    }
                    public function headings(): array {  //表格列头标题  WithHeadings
                        return array( '商品名', '售价', '库存');
                    }
                }
            调用  实例化的时候可以通过构造函数传递参数, 用于数据库查询
                use Excel;
                use AppExtensionsmyappControllersAdminExcelGoodsExport;
    
                public function exportGoods(Request $request) {
                    return Excel::download(new GoodsExport($request->all()), '商品导出表.xlsx');//直接下载
                }
    1.5 导出队列任务 针对需要导出大量数据的情况
       使用方法分两种,隐式、显示。
    1.直接创建队列任务 Excel::queue(new OrdersExport($request->all()), $ExportTask->filename, 'public'); 将存储到服务器 publc存储目录下。
    2.隐式,OrdersExport()导出类中继承 use IlluminateContractsQueueShouldQueue; 即可,正常使用
    Excel::store()存储到指定位置。
    官文: https://docs.laravel-excel.com/3.1/exports/queued.html
    可使用chain方法 增加最后执行任务,将在导出队列任务完全成功执行完成后调用。 Excel::queue()->chain([ new OrdersExportQueue($ExportTask->toArray()) ]);
        2.导入
            // 注意导入文件数据量可能过大,因此最好通过队列执行,每次导入一部分,通过标记跳过已导入的部分。。。导入同样可用queue加入队列任务,这里我自己写的方法,递归创建导入队列
            构造类
                use MaatwebsiteExcelConcernsToCollection;
                use IlluminateSupportCollection;
                use AppExtensionsmyappJobsProductImportQueue;   // 队列
                use AppExtensionsmyappModelsProduct;
                class ProductImport implements ToCollection {
                    public $path;
                    public function __construct($path) {
                        $this->path = $path;
                    }
                    public function collection(Collection $rows) {
                        // 缓存读取已导入数量
                        // 循环导入100条
                        // 若未导入完成,记录缓存,并重新创建队列 (或者重新执行队列?)
                        // dispatch(new ProductImportQueue($this->path));
                    }
                }
    
            调用
                use IlluminateSupportFacadesStorage;
                use AppExtensionsmyappControllersAdminExcelProductImport;
                use Excel;
    
                public function importProduct(Request $request) {
                    $file = $request->file('goods_excel');  // 通过laravel的request获取文件
                    if ($file && $file->isValid()) {
                        // 获取文件相关信息
                        $originalName = $file->getClientOriginalName(); // 文件原名
                        $ext = $file->getClientOriginalExtension();     // 扩展名
                        // $realPath = $file->getRealPath();   //临时文件的绝对路径
                        // $type = $file->getClientMimeType();     // image/jpeg
                        if($ext!='xlsx' && $ext!='xls'){
                            return $this->responseAjax('fail','请上传excel文件');
                        }
    
                        $filename = $originalName;
                        if(Storage::disk('public')->exists('uploads/'.$filename)) {
                            return $this->responseAjax('fail','文件已上传');
                        }
                        // 上传文件 存于服务器
                        Storage::disk('public')->makeDirectory('uploads');
                        Storage::disk('public')->putFileAs('uploads',$file,$filename);
    
                        //执行同步
                        $path = 'public/uploads/'.$filename;
                        Excel::import(new ProductImport($path), $path);
    
                        // use AppExtensionsmyappJobsProductImportQueue;
                        // dispatch(new ProductImportQueue($path));  加入队列
                    }
                }
  • 相关阅读:
    Scalaz(15)- Monad:依赖注入-Reader besides Cake
    Scalaz(14)- Monad:函数组合-Kleisli to Reader
    Scalaz(13)- Monad:Writer
    Scalaz(12)- Monad:再述述flatMap,顺便了解MonadPlus
    Scalaz(11)- Monad:你存在的意义
    Scalaz(10)- Monad:就是一种函数式编程模式-a design pattern
    Scalaz(9)- typeclass:checking instance abiding the laws
    Scalaz(8)- typeclass:Monoid and Foldable
    Scalaz(7)- typeclass:Applicative-idomatic function application
    Scalaz(6)- typeclass:Functor-just map
  • 原文地址:https://www.cnblogs.com/mengwangchuan/p/10441801.html
Copyright © 2011-2022 走看看