|
本帖最后由 周大胖子 于 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[0]);
-
- //$rows 是数组格式
- $this->createData($rows);
- }
- // public function ToCollection(Collection $rows)
- // {
- // //如果需要去除表头
- // unset($rows[0]);
- // //$rows 是数组格式
- // $this->createData($rows);
- // }
- // 存储
- public function createData($rows)
- {
- $allJson =array();
- // dd($rows);
-
- foreach ($rows as $k => $v) {
- // 由于部分sheet 页有大量空行,所以加入判断跳出循环
- if(empty($v[0])){
- break;
- }
- $allJson[] = $this->addJson($v);
- }
- // dd($allJson);
- DB::table('cms_sell_trademark')->insert($allJson);
- }
- // 拼一个json
- public function addJson($row){
- $stateCurrentArr = config('xufengcode.stateCurrentArr');
- $tradeCodeArr = config('xufengcode.tradeCodeArr');
- if (preg_match('/^([0-9]{4})-([0-9]{2})-([0-9]{2})$/', $row[4])) {
- $row[4] = $row[4];
- } else {
- $row[4] = null;
- }
- $row[7] = array_search( $row[7], $stateCurrentArr);
- $row[8] = array_search( $row[8], $tradeCodeArr);
- if(empty($row[9])){
- $row[9] = '';
- }
- $a = array(
- 'ctype' => $row[0],
- 'tmNumberText' => $row[1],
- 'tmNameText' => $row[2],
- 'registerDate' => $row[4],
- 'tmGoodsName' => $row[5],
- 'likegroup' => $row[6],
- 'stateCurrent' => $row[7],
- 'tradeCode' => $row[8],
- 'remarks' => $row[9]
- );
- 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[0]);
-
- //$rows 是数组格式
- $this->createData($rows);
- }
-
- // 存储
- public function createData($rows)
- {
- $allJson =array();
- // dd($rows);
-
- foreach ($rows as $k => $v) {
- // 由于部分sheet 页有大量空行,所以加入判断跳出循环
- if(empty($v[0])){
- break;
- }
- $allJson[] = $this->addJson($v);
- }
- // dd($allJson);
- DB::table('cms_sell_trademark')->insert($allJson);
- }
- // 拼一个json
- public function addJson($row){
- $stateCurrentArr = config('xufengcode.stateCurrentArr');
- $tradeCodeArr = config('xufengcode.tradeCodeArr');
- if (preg_match('/^([0-9]{4})-([0-9]{2})-([0-9]{2})$/', $row[4])) {
- $row[4] = $row[4];
- } else {
- $row[4] = null;
- }
- $row[7] = array_search( $row[7], $stateCurrentArr);
- $row[8] = array_search( $row[8], $tradeCodeArr);
- if(empty($row[9])){
- $row[9] = '';
- }
- $a = array(
- 'ctype' => $row[0],
- 'tmNumberText' => $row[1],
- 'tmNameText' => $row[2],
- 'registerDate' => $row[4],
- 'tmGoodsName' => $row[5],
- 'likegroup' => $row[6],
- 'stateCurrent' => $row[7],
- 'tradeCode' => $row[8],
- 'remarks' => $row[9]
- );
- return $a;
- }
- }
-
复制代码
|
|