周大胖子 发表于 2020-12-25 14:17:09

Laravel 新 excel 导入方法

本帖最后由 周大胖子 于 2020-12-25 16:19 编辑

使用组件maatwebsite/Excel 3.1 composer require maatwebsite/excel
安装完成后,搞一个 Import文件[我理解这玩意的意思是导入模型]
php artisan make:import CmsTrademarksImport --model=app\model\ CmsTrademarks


参考文献:https://learnku.com/articles/32400[说实话,这篇文章,怎么说呢, 嗯 乱七八糟]

本胖重新总结了一份:

      首先 就是控制器的文件,接收、存储、调用的问题 [ 这个统一复制就好 ]
   一:引入乱七八糟的文件[这是 控制器 ]
namespace App\Http\Controllers\Out;

use Illuminate\Routing\Controller as BaseController;

use Illuminate\Http\Request;

use Illuminate\Support\Facades\Input;

use Illuminate\Support\Facades\Storage;

use App\Model\CmsSellTrademark;


use PhpOffice\PhpSpreadsheet\Settings;

use DB;

// 导入模型
use App\Imports\CmsSellTrademarkImport;
// Imports
use Maatwebsite\Excel\Concerns\ToArray;

use Maatwebsite\Excel\Facades\Excel;
   二 接收判断文件,并调用import 【我觉得可以叫他导入模型】
public function import(Request $request)
    {
      // dd(1);

      if (!$request->hasFile('file')) {
            return [
                'code' => 1,
                'message' => '友情提示:未检索到上传文件'
            ];
      }
      
      $file = $request->file('file');
      
      // 保存随机
      $file->getClientSize();
      
      //扩展名
      $ext = $file->getClientOriginalExtension();
   
      // 这段代码是用来处理导入时报的一个读取XML过大的错误
      Settings::setLibXmlLoaderOptions(LIBXML_COMPACT | LIBXML_PARSEHUGE);

      // 设置内存无限制
      ini_set('memory_limit', -1);

      $newName = 'shop'.date('Y-m-d').time().'.'.$ext;
      // 存放到本地
      $path=$file->move('./uploads/excel/', $newName);

      $filePath = './uploads/excel/'.$newName;
       // dd( $filePath );

      $data = Excel::import(new CmsSellTrademarkImport,$filePath);
   
      return [
            'code' => 0,
            'message' => '导入成功' ,
            'data' =>$data
      ];

    }
   其实,即使没存进去,也会自动判断存储成功的,呵呵 。 没办法,没返回值 我不得搞个返回结果嘛-.-


好了,上面复制完了,下面开始看个人需求[ 第一种适合单个 sheet 导入;第二种适合多个sheet 导入 ]
      导入之前,先明白   DB::table('数据库名')->insert($Json); 其实是个可以批量导入的语言,如果 $json 是个数组,他就是插入批量数据,是个json 那就只插入一条数据


第一种:【单个版】文件:App\Imports\CmsSellTrademarkImport.php
<?php

namespace App\Imports;
            //   Imports

use App\Model\CmsSellTrademark;
use Illuminate\Support\Facades\Hash;
use Maatwebsite\Excel\Concerns\ToModel;
use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\ToArray;
use Maatwebsite\Excel\Concerns\ToCollection;
use Maatwebsite\Excel\Concerns\WithMultipleSheets;
use App\Imports\FirstSheetImport;
use DB;

class CmsSellTrademarkImport implements WithMultipleSheets
{


/**
    * @param Collection $collection
    */
    public function collection(Collection $rows)
    {
      
      //如果需要去除表头
      unset($rows);

      //$rows 是数组格式
      $this->createData($rows);
    }


        // public function ToCollection(Collection $rows)
//    {
//      //如果需要去除表头
//      unset($rows);
//      //$rows 是数组格式
//      $this->createData($rows);
//    }

    // 存储
    public function createData($rows)
    {

            $allJson =array();
         // dd($rows);
           
            foreach ($rows as $k => $v) {
                    // 由于部分sheet 页有大量空行,所以加入判断跳出循环
                    if(empty($v)){
                           break;
                    }
                    $allJson[] = $this->addJson($v);
            }
      // dd($allJson);
      DB::table('cms_sell_trademark')->insert($allJson);
    }

    // 拼一个json
    publicfunction addJson($row){
            $stateCurrentArr = config('xufengcode.stateCurrentArr');
      $tradeCodeArr = config('xufengcode.tradeCodeArr');

      if (preg_match('/^({4})-({2})-({2})$/', $row)) {
            $row = $row;
      } else {
            $row = null;
      }

      $row = array_search( $row, $stateCurrentArr);
      $row = array_search( $row, $tradeCodeArr);

      if(empty($row)){
            $row = '';
      }
            $a = array(
                    'ctype'                   => $row,
                 'tmNumberText'            => $row,
                 'tmNameText'            => $row,
                 'registerDate'            => $row,
                 'tmGoodsName'            => $row,
                 'likegroup'                    => $row,
                 'stateCurrent'            => $row,
                 'tradeCode'                    => $row,
                 'remarks'                    => $row
            );
            return $a;
    }
}



第二个 [多 sheet版] 其实这个版本,有两个导入模型,
   第一个文件:App\Imports\CmsSellTrademarkImport.php
<?php

namespace App\Imports;
            //   Imports

use App\Model\CmsSellTrademark;
use Illuminate\Support\Facades\Hash;
use Maatwebsite\Excel\Concerns\ToModel;
use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\ToArray;
use Maatwebsite\Excel\Concerns\ToCollection;
use Maatwebsite\Excel\Concerns\WithMultipleSheets;
use App\Imports\FirstSheetImport;
use DB;

class CmsSellTrademarkImport implements WithMultipleSheets
{
   
   

    // 获取分页数据
    public function sheets(): array
        {
          $sheet = [];
          for ($i=0; $i<=44; $i++) {
                $sheet[$i] = new FirstSheetImport();
          }
          return $sheet;
        }




}第二个:App\Imports\FirstSheetImport.php [ 名字随意 ]
<?php

namespace App\Imports;

use App\Model\CmsSellTrademark;
use Illuminate\Support\Facades\Hash;
use Maatwebsite\Excel\Concerns\ToModel;
use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\ToArray;
use Maatwebsite\Excel\Concerns\ToCollection;
use Maatwebsite\Excel\Concerns\WithMultipleSheets;
use DB;

class FirstSheetImport implements ToCollection
{
   /**
    * @param Collection $collection
    */
    public function collection(Collection $rows)
    {
      
      //如果需要去除表头
      unset($rows);

      //$rows 是数组格式
      $this->createData($rows);
    }

    // 存储
    public function createData($rows)
    {

            $allJson =array();
         // dd($rows);
           
            foreach ($rows as $k => $v) {
                    // 由于部分sheet 页有大量空行,所以加入判断跳出循环
                    if(empty($v)){
                           break;
                    }
                    $allJson[] = $this->addJson($v);
            }
      // dd($allJson);
      DB::table('cms_sell_trademark')->insert($allJson);
    }

    // 拼一个json
    publicfunction addJson($row){
            $stateCurrentArr = config('xufengcode.stateCurrentArr');
      $tradeCodeArr = config('xufengcode.tradeCodeArr');

      if (preg_match('/^({4})-({2})-({2})$/', $row)) {
            $row = $row;
      } else {
            $row = null;
      }

      $row = array_search( $row, $stateCurrentArr);
      $row = array_search( $row, $tradeCodeArr);

      if(empty($row)){
            $row = '';
      }
            $a = array(
                    'ctype'                   => $row,
                 'tmNumberText'            => $row,
                 'tmNameText'            => $row,
                 'registerDate'            => $row,
                 'tmGoodsName'            => $row,
                 'likegroup'                    => $row,
                 'stateCurrent'            => $row,
                 'tradeCode'                    => $row,
                 'remarks'                    => $row
            );
            return $a;
    }

}









页: [1]
查看完整版本: Laravel 新 excel 导入方法