laravel+phpoffice+easyexcel实现导入
资源包下载地址
https://download.csdn.net/download/QiZong__BK/89503486
easy-excel下载:
"dcat/easy-excel": "^1.0",
命令行:
composer require dcat/easy-excel
前端代码
<!doctype html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport"content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Document</title><!-- jQuery文件。务必在bootstrap.min.js 之前引入 --><script src="https://cdn.staticfile.net/jquery/3.2.1/jquery.min.js"></script><!-- 新 Bootstrap4 核心 CSS 文件 --><link rel="stylesheet" href="https://cdn.staticfile.net/twitter-bootstrap/4.3.1/css/bootstrap.min.css"><!-- bootstrap.bundle.min.js 用于弹窗、提示、下拉菜单,包含了 popper.min.js --><script src="https://cdn.staticfile.net/popper.js/1.15.0/umd/popper.min.js"></script><!-- 最新的 Bootstrap4 核心 JavaScript 文件 --><script src="https://cdn.staticfile.net/twitter-bootstrap/4.3.1/js/bootstrap.min.js"></script></head>
<body><form action="excel_import" method="post" enctype="multipart/form-data">@csrf<div class="form-group"><label for="exampleFormControlFile1">Example file input</label><input type="file" class="form-control-file" id="exampleFormControlFile1" name="file"></div><button type="submit" class="btn btn-primary">Primary</button>
</form></body>
</html>
后端代码实现
public function excel_import(){$file_name = request()->file('file');$filename = Str::random(20) . '.' . $file_name->getClientOriginalExtension();$path_name = $file_name->storeAs('/public/uploads/', $filename, 'public');
// dd($path);$file = public_path('storage/'.$path_name);$path = $this->real_file_path($path_name);try {$import_log = new ImportLog();$import_log->item = get_class(new TaskBomModel());$import_log->operator = Admin::user()->id;$import_log->save();$type_map = TaskBomModel::TYPE_MAP;$reader = new Xlsx();$spreadsheet = $reader->load($file);//获取c列2行单元格$sku_sn = $spreadsheet->getSheet(0)->getCell('C2')->getValue();//获取C列3行单元格的内容$bom_type = $spreadsheet->getSheet(0)->getCell('C3')->getValue();$type = array_search($bom_type, $type_map);//成品表数据$bom = GoodsSkuModel::query()->where('sku_sn', $sku_sn)->first();if (empty($bom)) {throw new Exception('关联成品编码' . $sku_sn . '不存在,请确认编码是否真实存在或前往产品界面添加');}$task_bom = TaskBomModel::where('sku_id', $bom->id)->get()->toArray();if (!empty($task_bom)) {throw new Exception('该BOM已存在');}if (!empty($bom)) {$task_bom = new TaskBomModel();$task_bom->bom_name = $bom->goods_name ?? '';$task_bom->bom_code = $bom->sku_sn ?? '';$task_bom->type = $type;$task_bom->bom_sku_name = $bom->sku_name ?? '';$task_bom->product_id = $bom->goods_id ?? '';$task_bom->sku_id = $bom->id ?? '';if ($task_bom->save()){$bom_success= true;}}if ($bom_success) {$row_map = Excel::import($path)->headingRow(10)->first()->toArray();foreach ($row_map as $map) {$complete_bom_sku_sn = trim($map['完整BOM存货编码']);$complete_bom_num = trim($map['完整BOM消耗数量']);$easy_bom_sku_sn = trim($map['简易BOM存货编码']);$easy_bom_num = trim($map['简易BOM消耗数量']);//判断完整BOM有值更新完整BOM字段if ($complete_bom_sku_sn) {//配料表数据$complete_bom_map = GzGoodsSkuModel::query()->where('sku_sn', $complete_bom_sku_sn)->first();if ($complete_bom_map == null) {$fail++;//记录错误编码ImportLogDetail::query()->create(['log_id' => $import_log->id,'log' => '物料编码' . $complete_bom_sku_sn . '不存在']);} else {$complete_data[] = ['sku_id' => $complete_bom_map->id,'num' => $complete_bom_num,'type' => 1,'remark' => null];
// dd($complete_data);TaskBomModel::where('id', $task_bom->id)->update(['full_map' => $complete_data //完整BOM]);ImportLogDetail::query()->create(['log_id' => $import_log->id,'status' => 1,'log' => '物料编码' . $complete_bom_sku_sn . '导入成功']);$success++;}}//判断简易BOM有值更新简易BOM字段if ($easy_bom_sku_sn) {//配料表数据$easy_bom_map = GzGoodsSkuModel::query()->where('sku_sn', $easy_bom_sku_sn)->first();if ($easy_bom_map == null) {$fail++;//记录错误编码ImportLogDetail::query()->create(['log_id' => $import_log->id,'log' => '物料编码' . $easy_bom_sku_sn . '不存在']);} else {$easy_data[] = ['sku_id' => $easy_bom_map->id,'num' => $easy_bom_num,'type' => 1,'remark' => null];TaskBomModel::where('id', $task_bom->id)->update(['basic_map' => $easy_data //简易BOM]);ImportLogDetail::query()->create(['log_id' => $import_log->id,'status' => 1,'log' => '物料编码' . $easy_bom_sku_sn . '导入成功']);$success++;}}}}$import_log->succeed = $success;$import_log->failed = $fail;$import_log->save();$url = admin_url('import_logs');$content = <<<EOF
库存导入成功:{$success},导入失败:{$fail}
<br>请在菜单<a target="_blank" href="{$url}" >【导入日志】</a>中查看记录
EOF;return $this->response()->success($content)->refresh();} catch (Exception $e) {return $this->response()->error($e->getMessage());}}function real_file_path($cover = ""): string{if ($cover) {if (Str::contains($cover, '//')) {return $cover;}return Storage::disk('public')->path($cover);} else {return '';}}
相关文章:
laravel+phpoffice+easyexcel实现导入
资源包下载地址 https://download.csdn.net/download/QiZong__BK/89503486 easy-excel下载: "dcat/easy-excel": "^1.0", 命令行: composer require dcat/easy-excel 前端代码 <!doctype html> <html lang"en&…...
Spring Boot集成多数据源的最佳实践
Spring Boot集成多数据源的最佳实践 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 为什么需要多数据源? 在实际的应用开发中,有时候…...
Java项目:基于SSM框架实现的班主任助理管理系统【ssm+B/S架构+源码+数据库+开题报告+毕业论文】
一、项目简介 本项目是一套基于SSM框架实现的班主任助理管理系统 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse或者idea 确保可以运行! 该系统功能完善、界面美观、操作简单、功…...
数据在内存中的存储方式
🌟🌟作者主页:ephemerals__ 🌟🌟所属专栏:C语言 目录 前言 一、整数的存储 二、大小端字节序及其判断 1.什么是大小端 2.为什么有大小端 3.用c语言编写程序判断大小端 三、浮点数的存储 1.浮点数…...
Selenium 监视数据收发
实际上,在我提供的示例中,确实使用了浏览器实例。webdriver.Chrome()这行代码正是创建了一个Chrome浏览器的WebDriver实例。Selenium Wire扩展了标准的Selenium WebDriver,允许你通过这个浏览器实例来监听网络请求。 当你运行类似这样的代码…...
基于 STM32 的智能睡眠呼吸监测系统设计
本设计的硬件构成: STM32F103C8T6单片机最小系统板(包含3.3V稳压电路时钟晶振电路复位电路(上电自复位,手动复位)),心率传感器、气压传感器、液晶显示、按键、蜂鸣器、LED灯、蓝牙模块组合而成…...
Spring的事务管理、AOP实现底层
目录 spring的事务管理是如何实现的? Spring的AOP的底层实现原理 spring的事务管理是如何实现的? 首先,spring的事务是由aop来实现的,首先要生成具体的代理对象,然后按照aop的整套流程来执行具体的操作逻辑ÿ…...
基于SpringBoot的篮球竞赛预约平台
你好,我是计算机学姐码农小野!如果你对篮球竞赛预约平台感兴趣或有相关需求,欢迎私信联系我。 开发语言: Java 数据库: MySQL 技术: SpringBootMySql 工具: MyEclipse、Tomcat 系统展示…...
学生用小台灯什么牌子的好?列举出几款学生用台灯推荐
眼睛是我们感知世界的窗口,但近年来,儿童青少年的视力健康却受到了严重困扰。数据显示,近视问题在儿童群体中呈现出明显的增长趋势,这给他们的学习和生活带来了诸多不便。虽然现代科技的快速发展使得电子产品成为了我们生活中不可…...
软件测试面试题:项目中的MQ是如何测试的?
通常,咱们会从两个方面来考虑:正常情况和异常情况。 首先,咱们得确保消息队列在正常工作时结果正确。比如,消息发送出去的时候,所有的字段都得齐全,接收方收到的消息也得一样。咱们得确保系统能够正确无误…...
Python爬取国家医保平台公开数据
国家医保服务平台数据爬取python爬虫数据爬取医疗公开数据 定点医疗机构查询定点零售药店查询医保机构查询药品分类与代码查询 等等,数据都能爬 接口地址:/ebus/fuwu/api/nthl/api/CommQuery/queryFixedHospital 签名参数:signData {dat…...
B站大课堂-自动化精品视频(个人存档)
基础知识 工业通信协议 Modbus 施耐德研发,有基于以太网的 ModbusTCP 协议和使用 485/232 串口通信的 ModbusRTU/ASCII。 Modbus 协议面世较早、协议简洁高效、商用免费、功能灵活、实现简单,是目前应用最广泛的现场总线协议。 我的笔记里边有一些推荐…...
C++_STL---priority_queue
priority_queue的相关介绍 优先级队列是一种容器适配器,根据严格的排序标准,它的第一个元素总是它所包含的元素中最大(小)的。该容器适配器类似于堆,在堆中可以随时插入元素,并且可以检索最大(小)堆元素(优先级队列中位于顶部的元…...
可移动天线辅助宽带通信的性能分析和优化
可移动天线辅助宽带通信的性能分析和优化 可移动天线 (MA) 已成为一种很有前景的技术,通过在发射器 (Tx) 和/或接收器 (Rx) 处实现天线的本地移动来实现更有利的信道条件,从而增强无线通信性能。 由于现有的MA辅助无线通信研究主要考虑平坦衰落信道中的…...
h5兼容table ,如何实现h5在app内使用h5渲染table表格而且实现横屏预览?
压图地址 横屏div 通过css 实现 transform: rotate(90deg); transformOrigin: 50vw 50vw ; height: 100vw; width: 100vh;<divclass"popup-box":style"{transform: originSet 0 ? rotate(90deg) : ,transformOrigin: originSet 0 ? 50vw 50vw : ,height…...
在windows上安装objection
安装命令pip install objection -i https://mirrors.aliyun.com/pypi/simple hook指定进程 objection -g 测试 explore 进程名不定是包名,也可能是app名字,如“测试”就是app的名字 若出现如下错误,说明python 缺少setuptools 直接安装setu…...
人脸特征68点识别 C++
1、加载一张图片 main函数: cv::Mat img cv::imread("5.jpg");vector<Point2f> points_vec dectectFace68(img);2、人脸68特征识别函数 在这里vector<Point2f> dectectFace68(Mat src) {vector<Point2f> points_vec;int* pResults …...
部署LVS-DR 群集
1 LVS-DR 集群 LVS-DR (Linux Virtual Server Director Server ) 工作模式, 是生产环境中最常用的一种工作模式 1.1:LVS-DR工作原理 LVS-DR 模式, Director Server 作为群集的访问入口, 不作为网关使用,…...
nginx的正向代理和反向代理
概念 正向代理以及缓存配置 代理:客户端不再是直接访问服务端,通过代理服务器访问服务端。 正向代理:面向客户端,我们通过代理服务器的ip地址访问目标服务器。 服务端只知道代理服务器的地址,真正的客户端ip可以隐…...
米国政府呼吁抛弃 C 和 C++
在开始前刚好我有一些资料,是我根据网友给的问题精心整理了一份「C的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!! 很多观点认为C 或 C永远不可被…...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...
群晖NAS如何在虚拟机创建飞牛NAS
套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...
人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent
安全大模型训练计划:基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标:为安全大模型创建高质量、去偏、符合伦理的训练数据集,涵盖安全相关任务(如有害内容检测、隐私保护、道德推理等)。 1.1 数据收集 描…...
