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

FastAdmin自定义Excel导入功能:从数据读取到灵活处理

1. 为什么需要自定义Excel导入功能FastAdmin自带的Excel导入功能虽然开箱即用但在实际项目中经常会遇到各种限制。最常见的问题就是系统强制要求Excel表头必须与数据库字段备注完全一致这种强耦合的设计会导致三个主要痛点首先当我们需要导入的Excel文件来自第三方系统时表头文字往往已经固定不可能为了适配系统而要求对方修改文件格式。比如财务系统导出的客户编号字段在数据库中可能是customer_id的备注这种差异会导致导入直接失败。其次系统默认的导入是一刀切的全量插入无法实现数据清洗和转换。实际业务中经常需要先对数据进行校验比如手机号格式、补全比如自动填充创建时间、甚至关联查询比如根据名称查找关联ID。我在去年做一个会员管理系统时就遇到需要把Excel中的部门名称转换为数据库中的部门ID的需求。最后有时候我们仅仅需要读取Excel内容而不需要入库。比如数据对比分析、临时报表生成等场景。系统自带的导入功能无法满足这种灵活需求这时候就需要完全自定义的读取逻辑。2. 快速搭建自定义导入功能框架2.1 前端界面配置在FastAdmin中启用导入功能非常简单只需要在模板文件的工具栏中添加import按钮即可。如果你需要自定义按钮样式或弹窗可以参考以下代码div classpanel-heading {:build_toolbar(refresh,add,edit,del,import)} /div更灵活的做法是直接使用HTML按钮JavaScript事件绑定。这种方式适合需要自定义导入逻辑的场景比如添加前置校验button idcustom-import classbtn btn-primary i classfa fa-upload/i 自定义导入 /button script $(#custom-import).click(function(){ // 这里可以添加前置逻辑 Fast.api.open(user/group/import); }); /script2.2 后端接口配置在对应的JS文件中需要配置导入接口地址。建议在表格初始化时就设置好所有CRUD接口Table.api.init({ extend: { index_url: user/group/index, add_url: user/group/add, edit_url: user/group/edit, del_url: user/group/del, import_url: user/group/import, // 关键配置 table: user_group, } });3. 核心文件读取方法实现3.1 通用文件读取方法在application/admin/library/traits/Backend.php中添加一个可复用的文件读取方法。这个方法需要处理三种常见格式XLSX、XLS和CSV。特别注意CSV文件的编码问题这是实际项目中最容易踩的坑protected function readFile($file) { if (!$file) { $this-error(__(请上传文件)); } $filePath ROOT_PATH . public . DS . $file; if (!is_file($filePath)) { $this-error(__(文件不存在)); } $ext pathinfo($filePath, PATHINFO_EXTENSION); $supported [csv, xls, xlsx]; if (!in_array($ext, $supported)) { $this-error(__(仅支持.implode(,, $supported).格式)); } try { if ($ext csv) { // 特殊处理CSV编码问题 $reader new \PhpOffice\PhpSpreadsheet\Reader\Csv(); $reader-setInputEncoding(GBK); // 根据实际情况调整 } elseif ($ext xls) { $reader new \PhpOffice\PhpSpreadsheet\Reader\Xls(); } else { $reader new \PhpOffice\PhpSpreadsheet\Reader\Xlsx(); } $spreadsheet $reader-load($filePath); $sheet $spreadsheet-getActiveSheet(); // 获取表头 $headers []; foreach ($sheet-getRowIterator(1,1) as $row) { foreach ($row-getCellIterator() as $cell) { $headers[] $cell-getValue(); } } // 获取数据行 $rows []; foreach ($sheet-getRowIterator(2) as $row) { $rowData []; foreach ($row-getCellIterator() as $index $cell) { $rowData[$headers[$index] ?? $index] $cell-getValue(); } $rows[] $rowData; } return $rows; } catch (\Exception $e) { $this-error(文件读取失败: .$e-getMessage()); } }3.2 常见问题处理方案在实际使用中有几个典型问题需要注意大文件内存溢出使用PhpSpreadsheet读取大Excel时容易内存不足。解决方案是启用缓存$reader new \PhpOffice\PhpSpreadsheet\Reader\Xlsx(); $reader-setReadDataOnly(true); $reader-setReadEmptyCells(false); Settings::setCache($cache); // 使用文件或Redis缓存日期格式混乱Excel中的日期可能被读取为数字。需要特殊处理$cellValue $cell-getValue(); if (\PhpOffice\PhpSpreadsheet\Shared\Date::isDateTime($cell)) { $cellValue \PhpOffice\PhpSpreadsheet\Shared\Date::excelToTimestamp($cellValue); $cellValue date(Y-m-d H:i:s, $cellValue); }公式计算问题默认不计算公式结果需要显式设置$reader-setReadDataOnly(false); // 允许计算公式4. 业务逻辑处理实战4.1 数据清洗与转换获取到原始数据后通常需要进行以下处理public function import() { $file $this-request-param(file); $rows $this-readFile($file); $success 0; foreach ($rows as $row) { // 空行过滤 if (empty(array_filter($row))) continue; // 数据清洗 $data [ name trim($row[姓名]), mobile preg_replace(/\D/, , $row[电话]), status $row[状态] 活跃 ? 1 : 0 ]; // 数据验证 if (!validateMobile($data[mobile])) { continue; // 或记录错误日志 } // 关联查询 $department Db::name(department) -where(name, $row[部门]) -find(); $data[department_id] $department[id] ?? 0; // 入库操作 try { Db::name(user)-insert($data); $success; } catch (\Exception $e) { // 错误处理 } } $this-success(成功导入{$success}条数据); }4.2 批量操作优化当处理大量数据时建议使用批量插入和事务Db::startTrans(); try { $chunks array_chunk($rows, 100); // 分批处理 foreach ($chunks as $chunk) { $insertData []; foreach ($chunk as $row) { // ...数据处理逻辑... $insertData[] $data; } Db::name(user)-insertAll($insertData); } Db::commit(); $this-success(导入成功); } catch (\Exception $e) { Db::rollback(); $this-error(导入失败: .$e-getMessage()); }5. 高级应用场景5.1 模板校验功能在实际项目中经常需要校验Excel模板是否符合要求。可以在读取文件后添加校验逻辑// 校验表头 $requiredHeaders [姓名, 手机号, 部门]; foreach ($requiredHeaders as $header) { if (!in_array($header, $headers)) { $this-error(缺少必要列: {$header}); } } // 校验数据有效性 foreach ($rows as $index $row) { if (empty($row[姓名])) { $this-error(第.($index2).行姓名不能为空); } }5.2 进度反馈机制对于大型文件导入可以通过Session记录进度// 前端轮询进度 public function getProgress() { $progress session(import_progress); return json([progress $progress ?? 0]); } // 后端更新进度 foreach ($rows as $i $row) { session(import_progress, round($i/count($rows)*100)); // ...处理逻辑... }5.3 文件上传配置最后别忘了在application/extra/upload.php中配置允许的文件类型mimetype jpg,png,gif,zip,rar,xls,xlsx,csv,pdf,doc,docx,如果遇到上传限制问题还需要检查PHP的upload_max_filesize和post_max_size配置。

相关文章:

FastAdmin自定义Excel导入功能:从数据读取到灵活处理

1. 为什么需要自定义Excel导入功能 FastAdmin自带的Excel导入功能虽然开箱即用,但在实际项目中经常会遇到各种限制。最常见的问题就是系统强制要求Excel表头必须与数据库字段备注完全一致,这种强耦合的设计会导致三个主要痛点: 首先&#xff…...

从需求到代码:基于快马平台快速构建javaweb在线考试系统实战

今天想和大家分享一个实战项目——基于SpringBootVue的在线考试系统。这个系统从需求分析到代码实现,我全程使用了InsCode(快马)平台来加速开发流程,效果出乎意料的好。 系统架构设计 采用前后端分离架构,后端使用SpringBootSpringSecurity&a…...

从零到一:手把手教你用TruckSim搭建你的第一辆虚拟牵引车模型

从零到一:手把手教你用TruckSim搭建你的第一辆虚拟牵引车模型 第一次打开TruckSim时,面对密密麻麻的参数和复杂的界面,很多新手会感到无从下手。作为一款专业的商用车动力学仿真软件,TruckSim确实有一定的学习门槛,但掌…...

开源智能体的安全第一课:OpenClaw案例

网罗开发(小红书、快手、视频号同名)大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等方…...

别再用临时邮箱了!用Python+Selenium自动化管理你的Augment AI多账户(附完整脚本)

构建可持续的Augment AI自动化账户管理系统 在AI辅助编程工具日益普及的今天,开发者们对高效工具的依赖程度越来越高。Augment AI作为一款强大的代码助手,其免费版本300次的使用限制常常成为开发者工作流中的瓶颈。传统解决方案如手动重置或使用临时邮箱…...

告别DCOM噩梦:手把手教你用KepOPC DA2UA中间件搞定OPC DA到UA的转换(附Python读写测试代码)

工业数据互通新范式:零配置实现OPC DA到UA的无缝迁移实战 如果你是一名工业自动化工程师,一定对这样的场景不陌生:凌晨两点还在客户现场调试DCOM配置,反复检查防火墙规则、用户权限和网络策略,却依然无法让OPC DA客户端…...

手把手教你学Simulink——基于Simulink的扰动观测器(DOB)补偿坡道重力分量

目录 手把手教你学Simulink——基于Simulink的扰动观测器(DOB)补偿坡道重力分量​ 摘要​ 一、背景与挑战​ 1.1 坡道重力扰动的痛点与传统控制局限​ 1.1.1 应用场景与核心指标​ 1.1.2 传统PI控制的缺陷​ 1.2 DOB控制的核心优势​ 1.3 设计目标​ 二、系统架构与D…...

YOLOv11卷积模块深度剖析:从参数解析到实战应用

1. YOLOv11卷积模块设计精要 第一次接触YOLOv11的配置文件时,我和大多数开发者一样被那些看似简单却暗藏玄机的参数搞得一头雾水。特别是当我在backbone部分看到[-1, 1, Conv, [64, 3, 2]]这样的配置时,直觉告诉我输出通道数应该是64,但实际运…...

高并发系统的“救命稻草”——BASE 理论

今天我们要聊的话题,是互联网架构的“遮羞布”,也是高并发系统的“救命稻草”——BASE 理论。如果说 ACID(原子性、一致性、隔离性、持久性)是传统数据库的“洁癖”,要求数据必须时刻保持完美,那 BASE 就是…...

Path of Building汉化版终极指南:5步掌握流放之路角色构建神器

Path of Building汉化版终极指南:5步掌握流放之路角色构建神器 【免费下载链接】PoeCharm Path of Building Chinese version 项目地址: https://gitcode.com/gh_mirrors/po/PoeCharm 还在为流放之路复杂的角色构建而头疼吗?PoeCharm作为Path of …...

在WSL2上搞定PyTorch模型转昇腾OM:我的Atlas 200DK部署踩坑实录

在WSL2上实现PyTorch模型到昇腾OM的高效转换:避坑指南与实战解析 对于希望在Windows环境下完成昇腾模型转换的开发者来说,WSL2提供了一个近乎完美的解决方案。本文将深入探讨如何在这一环境中高效完成从PyTorch到昇腾OM模型的完整转换流程,同…...

3个突破性方案让游戏玩家实现Steam创意工坊资源自由获取

3个突破性方案让游戏玩家实现Steam创意工坊资源自由获取 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 在数字娱乐日益普及的今天,Steam创意工坊作为游戏模组的重要…...

5分钟快速上手BepInEx:Unity游戏插件开发的终极解决方案

5分钟快速上手BepInEx:Unity游戏插件开发的终极解决方案 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx BepInEx(Bepis Injector Extensible)是…...

HunyuanVideo-Foley保姆级教程:Docker Compose编排WebUI+API+Redis缓存

HunyuanVideo-Foley保姆级教程:Docker Compose编排WebUIAPIRedis缓存 1. 环境准备与快速部署 在开始之前,请确保您的硬件配置满足以下要求: 显卡:RTX 4090/4090D 24GB显存内存:≥120GBCPU:10核及以上磁盘…...

OpenLens节点和Pod菜单扩展完整指南:恢复Kubernetes管理的关键功能

OpenLens节点和Pod菜单扩展完整指南:恢复Kubernetes管理的关键功能 【免费下载链接】openlens-node-pod-menu Node and pod menus for OpenLens 项目地址: https://gitcode.com/gh_mirrors/op/openlens-node-pod-menu 引言:解决OpenLens 6.3.0的功…...

新手友好:借助快马平台的免费token轻松迈出AI应用开发第一步

作为一名刚接触AI开发的新手,我最近在InsCode(快马)平台上完成了一个文本摘要生成器的项目,整个过程非常顺畅。这个平台对初学者特别友好,尤其是提供了免费token,让我们可以零成本体验AI开发的乐趣。 理解token的概念 刚开始我对…...

Unity射线检测Raycast避坑指南:从LayerMask到HitInfo,新手最容易踩的5个坑

Unity射线检测Raycast避坑指南:从LayerMask到HitInfo的实战解析 在Unity开发中,射线检测(Raycast)就像游戏世界的触觉神经,它让虚拟物体有了"感知"能力。但这条看似简单的直线背后,却藏着不少让新手开发者抓狂的陷阱。…...

Qwen3-0.6B-FP8从部署到应用:完整流程详解,新手必看

Qwen3-0.6B-FP8从部署到应用:完整流程详解,新手必看 你是不是刚接触AI模型,看着各种复杂的部署命令和配置就头疼?想快速体验一个能聊天、能推理、还能帮你写东西的智能助手,但又担心自己的电脑配置不够,或…...

脑机接口(BCI)全景解析:从原理到产业,开发者入局指南

脑机接口(BCI)全景解析:从原理到产业,开发者入局指南 引言 从帮助渐冻症患者“开口说话”,到用“意念”操控无人机,脑机接口(BCI)正从科幻走进现实,成为“AI for Scienc…...

Docker网络扫盲:除了host.docker.internal,还有哪些方法能让Dify容器访问宿主机的服务?

Docker容器与宿主机通信的5种实战方案及选型指南 当你第一次在Docker容器里尝试连接宿主机上的MySQL或Redis服务时,那个经典的"Connection refused"错误可能会让你困惑不已。为什么明明在宿主机上运行得好好的服务,到了容器里用localhost就访问…...

Whisper.cpp 跨平台编译与语音识别实战指南

1. Whisper.cpp 是什么?能做什么? 第一次接触 Whisper.cpp 是在一个语音转文字的需求场景中。当时需要处理大量会议录音,但发现主流的语音识别工具要么需要联网,要么对硬件要求极高。直到发现了这个基于 C 实现的轻量级解决方案&a…...

AI建站工具避坑指南:10个高频问题与真相解答

面对AI建站这个新事物,心动的人多,但真正敢下手的人,心里都藏着不少问号。“这东西靠谱吗?”“我的数据会不会丢了?”“用这个做了网站,以后会不会被圈住?”这些顾虑非常正常。今天这篇文章&…...

Vue多文件学习项目综合案例——面经基础版,黑马vue教程

文章目录一、项目截图二、主要知识点三、main.js四、App.vue五、viewsArticle.vueArticleDetail.vueCollect.vueLayout.vueLike.vueUser.vuerouterindex.js一、项目截图 二、主要知识点 路由跳转路由传参缓存组件:keep-alive 三、main.js import Vue from vue im…...

Palworld存档工具:高效解决游戏存档格式转换与数据解析的技术方案

Palworld存档工具:高效解决游戏存档格式转换与数据解析的技术方案 【免费下载链接】palworld-save-tools Tools for converting Palworld .sav files to JSON and back 项目地址: https://gitcode.com/gh_mirrors/pa/palworld-save-tools Palworld存档工具是…...

Bifrost:三星固件处理的跨平台工具解决方案

Bifrost:三星固件处理的跨平台工具解决方案 【免费下载链接】SamloaderKotlin 项目地址: https://gitcode.com/gh_mirrors/sa/SamloaderKotlin 在三星设备的维护与开发过程中,固件管理始终是核心环节。无论是官方系统更新、自定义ROM开发还是设备…...

entr 社区贡献终极指南:从新手到核心开发者的快速成长路径

entr 社区贡献终极指南:从新手到核心开发者的快速成长路径 【免费下载链接】entr Run arbitrary commands when files change 项目地址: https://gitcode.com/gh_mirrors/en/entr entr 是一款轻量级文件变化监控工具,能够在文件发生变化时自动执行…...

AI辅助开发:让快马AI成为你的编程搭档,迭代优化openclaw风格代码

今天想和大家分享一个开发小技巧:如何用AI辅助工具快速迭代优化代码。最近我在做一个数据抓取的小项目,需要实现类似openclaw的功能,正好用InsCode(快马)平台的AI功能试了试,效果出乎意料的好。 基础功能实现 最开始我只需要一个简…...

颠覆单机局限:用Nucleus Co-op打造4人同屏游戏空间

颠覆单机局限:用Nucleus Co-op打造4人同屏游戏空间 【免费下载链接】splitscreenme-nucleus Nucleus Co-op is an application that starts multiple instances of a game for split-screen multiplayer gaming! 项目地址: https://gitcode.com/gh_mirrors/spl/sp…...

HoRNDIS:Mac与Android USB网络共享终极指南

HoRNDIS:Mac与Android USB网络共享终极指南 【免费下载链接】HoRNDIS Android USB tethering driver for Mac OS X 项目地址: https://gitcode.com/gh_mirrors/ho/HoRNDIS 想在Mac上使用Android手机的USB网络共享功能吗?HoRNDIS这款免费开源驱动就…...

Cyber Engine Tweaks终极优化指南:5个简单技巧快速提升《赛博朋克2077》AMD处理器性能

Cyber Engine Tweaks终极优化指南:5个简单技巧快速提升《赛博朋克2077》AMD处理器性能 【免费下载链接】CyberEngineTweaks Cyberpunk 2077 tweaks, hacks and scripting framework 项目地址: https://gitcode.com/gh_mirrors/cy/CyberEngineTweaks Cyber En…...