当前位置: 首页 > news >正文

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下载&#xff1a; "dcat/easy-excel": "^1.0", 命令行&#xff1a; composer require dcat/easy-excel 前端代码 <!doctype html> <html lang"en&…...

Spring Boot集成多数据源的最佳实践

Spring Boot集成多数据源的最佳实践 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 为什么需要多数据源&#xff1f; 在实际的应用开发中&#xff0c;有时候…...

Java项目:基于SSM框架实现的班主任助理管理系统【ssm+B/S架构+源码+数据库+开题报告+毕业论文】

一、项目简介 本项目是一套基于SSM框架实现的班主任助理管理系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、功…...

数据在内存中的存储方式

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;C语言 目录 前言 一、整数的存储 二、大小端字节序及其判断 1.什么是大小端 2.为什么有大小端 3.用c语言编写程序判断大小端 三、浮点数的存储 1.浮点数…...

Selenium 监视数据收发

实际上&#xff0c;在我提供的示例中&#xff0c;确实使用了浏览器实例。webdriver.Chrome()这行代码正是创建了一个Chrome浏览器的WebDriver实例。Selenium Wire扩展了标准的Selenium WebDriver&#xff0c;允许你通过这个浏览器实例来监听网络请求。 当你运行类似这样的代码…...

基于 STM32 的智能睡眠呼吸监测系统设计

本设计的硬件构成&#xff1a; STM32F103C8T6单片机最小系统板&#xff08;包含3.3V稳压电路时钟晶振电路复位电路&#xff08;上电自复位&#xff0c;手动复位&#xff09;&#xff09;&#xff0c;心率传感器、气压传感器、液晶显示、按键、蜂鸣器、LED灯、蓝牙模块组合而成…...

Spring的事务管理、AOP实现底层

目录 spring的事务管理是如何实现的&#xff1f; Spring的AOP的底层实现原理 spring的事务管理是如何实现的&#xff1f; 首先&#xff0c;spring的事务是由aop来实现的&#xff0c;首先要生成具体的代理对象&#xff0c;然后按照aop的整套流程来执行具体的操作逻辑&#xff…...

基于SpringBoot的篮球竞赛预约平台

你好&#xff0c;我是计算机学姐码农小野&#xff01;如果你对篮球竞赛预约平台感兴趣或有相关需求&#xff0c;欢迎私信联系我。 开发语言&#xff1a; Java 数据库&#xff1a; MySQL 技术&#xff1a; SpringBootMySql 工具&#xff1a; MyEclipse、Tomcat 系统展示…...

学生用小台灯什么牌子的好?列举出几款学生用台灯推荐

眼睛是我们感知世界的窗口&#xff0c;但近年来&#xff0c;儿童青少年的视力健康却受到了严重困扰。数据显示&#xff0c;近视问题在儿童群体中呈现出明显的增长趋势&#xff0c;这给他们的学习和生活带来了诸多不便。虽然现代科技的快速发展使得电子产品成为了我们生活中不可…...

软件测试面试题:项目中的MQ是如何测试的?

通常&#xff0c;咱们会从两个方面来考虑&#xff1a;正常情况和异常情况。 首先&#xff0c;咱们得确保消息队列在正常工作时结果正确。比如&#xff0c;消息发送出去的时候&#xff0c;所有的字段都得齐全&#xff0c;接收方收到的消息也得一样。咱们得确保系统能够正确无误…...

Python爬取国家医保平台公开数据

国家医保服务平台数据爬取python爬虫数据爬取医疗公开数据 定点医疗机构查询定点零售药店查询医保机构查询药品分类与代码查询 等等&#xff0c;数据都能爬 接口地址&#xff1a;/ebus/fuwu/api/nthl/api/CommQuery/queryFixedHospital 签名参数&#xff1a;signData {dat…...

B站大课堂-自动化精品视频(个人存档)

基础知识 工业通信协议 Modbus 施耐德研发&#xff0c;有基于以太网的 ModbusTCP 协议和使用 485/232 串口通信的 ModbusRTU/ASCII。 Modbus 协议面世较早、协议简洁高效、商用免费、功能灵活、实现简单&#xff0c;是目前应用最广泛的现场总线协议。 我的笔记里边有一些推荐…...

C++_STL---priority_queue

priority_queue的相关介绍 优先级队列是一种容器适配器&#xff0c;根据严格的排序标准&#xff0c;它的第一个元素总是它所包含的元素中最大(小)的。该容器适配器类似于堆&#xff0c;在堆中可以随时插入元素&#xff0c;并且可以检索最大(小)堆元素(优先级队列中位于顶部的元…...

可移动天线辅助宽带通信的性能分析和优化

可移动天线辅助宽带通信的性能分析和优化 可移动天线 (MA) 已成为一种很有前景的技术&#xff0c;通过在发射器 (Tx) 和/或接收器 (Rx) 处实现天线的本地移动来实现更有利的信道条件&#xff0c;从而增强无线通信性能。 由于现有的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 进程名不定是包名&#xff0c;也可能是app名字&#xff0c;如“测试”就是app的名字 若出现如下错误&#xff0c;说明python 缺少setuptools 直接安装setu…...

人脸特征68点识别 C++

1、加载一张图片 main函数&#xff1a; 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 &#xff08;Linux Virtual Server Director Server ) 工作模式&#xff0c; 是生产环境中最常用的一种工作模式 1.1&#xff1a;LVS-DR工作原理 LVS-DR 模式&#xff0c; Director Server 作为群集的访问入口&#xff0c; 不作为网关使用&#xff0c;…...

nginx的正向代理和反向代理

概念 正向代理以及缓存配置 代理&#xff1a;客户端不再是直接访问服务端&#xff0c;通过代理服务器访问服务端。 正向代理&#xff1a;面向客户端&#xff0c;我们通过代理服务器的ip地址访问目标服务器。 服务端只知道代理服务器的地址&#xff0c;真正的客户端ip可以隐…...

米国政府呼吁抛弃 C 和 C++

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「C的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; 很多观点认为C 或 C永远不可被…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...