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]