fastadmin导入excel并对导入数据处理

情景描述


fastadmin有自带的导入功能,但是不好用,它要求你的表格标题必须跟数据表的备注一致,而且拿到的数据是直接插入数据表,我们无法获取想要的数据并对数据进行处理;而且有时候我们只是想要单纯的读取文件功能,系统自带的无法满足,所以需要对导入功能重写。

重写导入功能


1.打开导入按钮

在你的模板文件中,在工具栏添加import功能即可,如果要自定义导入按钮,可以参考我的另一篇文章fastadmin后台自定义按钮和弹窗-CSDN博客

{:build_toolbar('refresh,add,edit,del,import')}

2.js文件添加导入接口链接

在后台对应功能的js文件初始化表格参数配置中添加链接即可

// 初始化表格参数配置
Table.api.init({extend: {index_url: 'user/group/index',add_url: 'user/group/add',edit_url: 'user/group/edit',del_url: 'user/group/del',multi_url: 'user/group/multi',import_url: 'user/group/import', //导入接口链接table: 'user_group',}
});

3.重写import方法

  • (1)先在application/admin/library/traits/Backend.php文件中添加读取文件数据方法

    /*** 读取文件数据并返回* @return array*/protected function readFile($file){if (!$file) {$this->error(__('Parameter %s can not be empty', 'file'));}$filePath = ROOT_PATH . DS . 'public' . DS . $file;if (!is_file($filePath)) {$this->error(__('No results were found'));}//实例化reader$ext = pathinfo($filePath, PATHINFO_EXTENSION);if (!in_array($ext, ['csv', 'xls', 'xlsx'])) {$this->error(__('Unknown data format'));}if ($ext === 'csv') {$file = fopen($filePath, 'r');$filePath = tempnam(sys_get_temp_dir(), 'import_csv');$fp = fopen($filePath, "w");$n = 0;while ($line = fgets($file)) {$line = rtrim($line, "\n\r\0");$encoding = mb_detect_encoding($line, ['utf-8', 'gbk', 'latin1', 'big5']);if ($encoding != 'utf-8') {$line = mb_convert_encoding($line, 'utf-8', $encoding);}if ($n == 0 || preg_match('/^".*"$/', $line)) {fwrite($fp, $line . "\n");} else {fwrite($fp, '"' . str_replace(['"', ','], ['""', '","'], $line) . "\"\n");}$n++;}fclose($file) || fclose($fp);$reader = new Csv();} elseif ($ext === 'xls') {$reader = new Xls();} else {$reader = new Xlsx();}//加载文件try {if (!$PHPExcel = $reader->load($filePath)) {$this->error(__('Unknown data format'));}$currentSheet = $PHPExcel->getSheet(0);  //读取文件中的第一个工作表$allColumn = $currentSheet->getHighestDataColumn(); //取得最大的列号$allRow = $currentSheet->getHighestRow(); //取得一共有多少行$maxColumnNumber = Coordinate::columnIndexFromString($allColumn);//读取第一行字段名$fields = [];for ($currentRow = 1; $currentRow <= 1; $currentRow++) {for ($currentColumn = 1; $currentColumn <= $maxColumnNumber; $currentColumn++) {$val = $currentSheet->getCellByColumnAndRow($currentColumn, $currentRow)->getValue();$fields[] = $val;}}//读取行数据$row = [];for ($currentRow = 2; $currentRow <= $allRow; $currentRow++) {$values = [];for ($currentColumn = 1; $currentColumn <= $maxColumnNumber; $currentColumn++) {$val = $currentSheet->getCellByColumnAndRow($currentColumn, $currentRow)->getValue();$values[] = is_null($val) ? '' : $val;}$row[] = array_combine($fields, $values);}} catch (Exception $exception) {$this->error($exception->getMessage());}if (!$row) {$this->error(__('No rows were updated'));}return $row;}
    
  • (2)在后台控制器中重写import方法,并调用上面的readFile方法读取数据,然后就可以对数据进行处理

    	/*** 重写import方法*/public function import(){$file = $this->request->request('file'); //'file'为文件字段名$data = $this->readFile($file);foreach ($data as $row){//do something//var_dump($row);}$this->success('导入成功');}
    

4.添加上传文件类型

如果是刚下载的框架,由于没有配置允许上传的文件类型,导入的时候会报错提示“上传文件格式受限制”,则需要添加上传文件类型,直接在配置文件application/extra/upload.php中的mimetype添加需要的文件类型即可

	/*** 可上传的文件类型*/'mimetype'  => 'jpg,png,bmp,jpeg,gif,webp,zip,rar,wav,mp4,mp3,webm,xls,xlsx,csv',

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/662163.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

丰田再怼「纯电动」,抛出「30%上限论」背后的焦虑和矛盾

让传统车企「丢掉」燃油车的包袱&#xff0c;并不简单。一边是赚钱&#xff0c;一边是烧钱&#xff0c;如何平衡是一个不小的难题。 本周&#xff0c;丰田董事长丰田章男对外表示&#xff0c;其预测未来电动汽车的市场份额将只有30%。而在电动化进程中&#xff0c;丰田章男一直…

【智慧农业】东胜物联温室监控系统硬件解决方案,自动化控制温室灯光、温湿度等

温室监控系统旨在提高智慧农业的工业生产率和效率。根据最近的一项研究&#xff0c;农业领域的物联网市场预计到2026年将达到约187亿美元。物联网技术包括自主耕作方法&#xff0c;帮助农场生产高质量的商品&#xff0c;并为农场经理提供最佳功能。某上市药企因业务需要&#x…

惊鸿一瞥-网络初识

&#x1f495;"Echo"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;惊鸿一瞥-网络初识 一.网络的发展过程 网络的发展过程是循序渐进的,大致可以分为四个阶段: 单机时代->局域网时代->广域网时代->互联网时代 单机时代:就是每个机器之间…

[SwiftUI]使用UIActivityViewController来实现系统分享功能

在 SwiftUI 中&#xff0c;你可以使用 UIActivityViewController 来实现系统分享功能。由于 SwiftUI 目前没有直接提供类似的视图或修饰符&#xff0c;你需要使用 UIViewControllerRepresentable 协议来创建一个可以在 SwiftUI 视图中使用的 ActivityView。 首先&#xff0c;你…

BIO、NIO编程与直接内存、零拷贝

一、网络通信 1、什么是socket&#xff1f; Socket 是应用层与 TCP/IP 协议族通信的中间软件抽象层&#xff0c;它是一组接口&#xff0c;一般由操作 系统提供。客户端连接上一个服务端&#xff0c;就会在客户端中产生一个 socket 接口实例&#xff0c;服务端每接受 一个客户端…

[机缘参悟-142] :一个软件架构师对佛学的理解 -6- 从计算机和数学的角度理解佛家的“因果”与十二因缘

目录 一、什么是因缘 1.1 佛家的因缘 1.2 佛家的因缘与因果轮回 1.2 从计算机角度理解因缘 1.3 从数学的角度理解因缘 二、佛家的十二因缘 2.1 大多数人的轮回 2.2 大多数人的的十二因缘轮回 2.3 十二因缘与三世因果的关系 2.4 十二因缘的现实意义 2.5 十二因缘与生…

Trie树数据结构——(字符串统计,最大异或对)

Trie树&#xff1a;是一种能够高效存储和查找字符串集合的数据结构 Trie字符串统计 思路&#xff1a; &#xff08;笔记来自AcWing 835. Trie字符串统计 - AcWing&#xff09; 代码如下&#xff1a; #include<iostream> #include<cstdio> #include<string>…

上位机图像处理和嵌入式模块部署(二进制图像的读写)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 之前我们说过&#xff0c;对于图像处理而言&#xff0c;势必会涉及到文件的读写。但是不同格式文件的读写&#xff0c;这本身又是体力活&#xff0…

CodeFuse成功支持通义千问算法大赛,评测方案已开源

前段时间&#xff0c; 首届通义千问AI挑战赛成功举办&#xff0c;CodeFuse 为大赛提供技术支持&#xff0c;模型微调框架 MFTCoder 和 CodeFuseEval 评测框架为大赛保驾护航&#xff0c;助力大赛圆满完成。我们基于leetcode 阿里和蚂蚁最新面试题库建设了“模型赛马”在线打榜的…

HTML入门

学习视频 初识HTML 什么是HTML HTML&#xff1a;Hyper Text Markup Language&#xff08;超文本标记语言&#xff09; 超文本包括&#xff1a;文字、图片、音频、视频、动画等 HTML 5&#xff0c;提供了一些新的元素和一些有趣的新特性&#xff0c;同时也建立了一些新规则。…

从传统到智慧:文旅产业的数字化变革

随着科技的迅猛发展和数字化时代的到来&#xff0c;文旅产业正经历着一场前所未有的变革。传统的旅游模式和服务方式逐渐被智慧化的技术和应用所取代&#xff0c;为游客带来更加便捷、高效、个性化的体验。本文将探讨文旅产业如何从传统模式向智慧化转型&#xff0c;以及数字化…

springboot 集成 nacos (demo 版)

环境要求&#xff1a;本地安装 nacos&#xff08;windows版本&#xff09;&#xff0c;jdk 是 8&#xff0c;安装完还得在 nacos 上面配置一个 yaml 类型的配置文件&#xff0c;方便项目演示读取。 提示&#xff1a;如标题所示&#xff0c;本文只介绍如何从零到一的去集成 naco…

基于Java SSM框架实现智能快递分拣系统项目【项目源码】

基于java的SSM框架实现智能快递分拣系统演示 JAVA简介 Java主要采用CORBA技术和安全模型&#xff0c;可以在互联网应用的数据保护。它还提供了对EJB&#xff08;Enterprise JavaBeans&#xff09;的全面支持&#xff0c;java servlet API&#xff0c;JSP&#xff08;java serv…

xss 盲打使用

使用beef等内网xss平台&#xff0c;或外网xss平台&#xff08;XSS平台-仅用于xss安全测试专用、XSS平台 - &#xff08;支持http/https&#xff09;XSS Platform&#xff09; 将生成的js脚本写到网站的留言框处&#xff0c;但对应的用户(尤其是admin)查看留言&#xff0c;就会…

【Vue.js设计与实现】第一篇:框架设计概览-阅读笔记(完结)

从高层设计的角度去探讨框架需要关注的问题。 参考&#xff1a;速读《Vue.js 设计与实现》 - 掘金 (juejin.cn) 系列目录&#xff1a; 标题博客第一篇&#xff1a;框架设计概览【Vue.js设计与实现】第一篇&#xff1a;框架设计概览-阅读笔记第二篇&#xff1a;响应系统【Vue.…

Vue-51、Vue技术github案例(发送ajax)

1、在index引入bootstrap.csss (注意第三方css库最好在indxe里面引入) 2、List.vue源码 <template><div class"row"><div v-show"users.length" class"card" v-for"p in users" :key"p.login"><a :hr…

Qt/C++音视频开发65-切换声卡/选择音频输出设备/播放到不同的声音设备/声卡下拉框

一、前言 近期收到一个用户需求&#xff0c;要求音视频组件能够切换声卡&#xff0c;首先要在vlc上实现&#xff0c;于是马不停蹄的研究起来&#xff0c;马上查阅对应vlc有没有自带的api接口&#xff0c;查看接口前&#xff0c;先打开vlc播放器&#xff0c;看下能不能切换&…

一条select在mysql中的执行过程

查询缓存&#xff1a; 一个select语句&#xff0c;会先到查询缓存中看看&#xff0c;若是以前执行过&#xff0c;直接将查询结果返回给客户端&#xff0c;若是查询缓存没有命中&#xff0c;就需要执行后面的计划 分析器 如果没有命中查询缓存&#xff0c;就要开始分析器了&am…

第八篇:node模版引擎Handlebars及他的高级用法(动态参数)

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! ​ 目录 &#x1f4d8; 引言&#xff1a; &#x1f…

【VSCode 光标返回上一位置】

默认按键 Windows: Alt ← ;或者 鼠标侧键 Linux: Ctrl Alt - ;貌似数字键盘的减号没效果 Mac: Ctrl - 自定义修改方法&#xff1a; VSCode左下角 “管理 / Manage” “键盘快捷方式 / KeyBoard Shortcuts” 搜索 “前进 / Go Forward 或 后退 / Go Back” 双击需…