ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

PHP+Excel通用课表查询系统实战:从解析到部署

PHP+Excel通用课表查询系统实战:从解析到部署 简介这是一份基于PHP与Excel的通用课表查询系统源码包面向学校、培训机构或个人学习计划管理场景可用于课程表的导入、查询与展示也适合作为毕业设计或Web开发入门案例。压缩包共19个文件以8个xls数据样例表格和5个php核心功能文件为主体辅以html/css/js前端页面、使用说明文档等整体仅68KB目录按功能模块划分结构清晰。目前已有240人学习下载适合需要参考PHP文件处理与数据库交互的开发者。源码覆盖PHPExcel/Spout类库读写Excel、PDO/mysqli数据库操作、前端动态表单交互等关键知识点附带多张课程表与财务报表样例可帮助理解从Excel数据到Web查询展示的完整流程也可作为二次开发的基础框架。1. 为什么做通用课表查询系统从“改课表”到“改Excel”做过学校信息化的人应该都有同感课表查询从来都不是一个“技术难”的事而是一个“杂事特别多”的事。每个学期开学教务处排完课老师们第一件事就是问“课表什么时候能查”学生们则关心“这周在哪上课”。如果学校有正儿八经的教务系统这事还好办但很多培训机构、职业技术学校、二级学院甚至部分中小学用的还是纯手工排课表一张Excel走天下。这套“phpexcel通用课表查询系统 v3.8”解决的就是这个场景下的问题不用建复杂的后台管理界面不用手动一条条录入数据库直接把教务处排好的Excel课表扔进系统前端就能按班级、教师、教室等维度查课。它的核心优势用大白话说就是课表数据由Excel统一维护查询结果由PHP动态生成两者通过一个解析导入流程衔接起来。这跟传统的“后台表单录数据”方案比省掉了一个大环节。教务老师不需要学习任何新系统排课仍然用Excel排完保存、上传、自动解析完事。信息中心也不用每次开学都加班导数据只需确保Excel格式符合约定点一下导入按钮即可。这个系统适合谁来用我总结了几类典型用户没有独立教务系统、长期用Excel管理课表的学校或培训机构有教务系统但导出格式不灵活需要二次加工展示的部门想快速搭建一个课表查询入口又不想花太多开发成本的团队对PHP和Excel数据解析感兴趣的开发者拿它当练手项目也很有价值我在实际测试这个包的时候第一感受是“它把课表场景里的坑基本都踩过了”。比如合并单元格怎么拆、跨周课程怎么匹配、不同Excel列顺序怎么兼容、大数据量下查询性能怎么保障这些问题在v3.8版本里都有对应的处理逻辑。所以这篇文章不是简单介绍“这个系统有什么页面”而是想把它背后的设计思路、核心代码逻辑、部署过程中的坑和排查手段都捋一遍——对你理解PHP处理Excel的实际应用会是一次特别完整的实战参考。2. 核心模块拆解Excel解析、课表存储与查询引擎2.1 Excel数据源的设计为什么坚持用Excel当“数据库”很多开发者第一次接触这个项目时会问既然都有了MySQL为什么还要用Excel当数据源是不是多此一举一开始我也这么想但实际用下来发现课表这个场景有一个非常独特的属性数据变化频率极低但维护者的技术水平差异极大。一个学期的课表从开学到期末基本是固定的。中间即使有调课也是局部微调不会全表重来。这种情况下如果做成后台管理界面反而增加了维护成本——排课老师得先学会系统再把Excel里的内容一条条录入进去录错一个单元格课表就对不上号了。而直接让Excel当数据源维护零成本教务处原有的工作流程一点不变。当然Excel当“数据库”也有明显的弱点比如并发性能差、多人同时编辑会冲突、缺少数据约束容易出错。因此v3.8采取了一种折中方案Excel负责“录入与维护”MySQL负责“存储与查询”。也就是说系统会把Excel解析后导入到MySQL表中前端页面查的其实是MySQL不是直接读Excel。这样一来既保住了Excel的易维护性又获得了数据库的查询性能和稳定性。这个设计思路我觉得非常聪明它没有盲目追求“全自动读取Excel”的花哨效果而是把工具用在了最合适的位置。2.2 Excel上传与解析流程从文件到结构化数据整个流程的第一步是把Excel文件上传到服务器。这里有一个需要特别注意的地方不要把上传逻辑和解析逻辑写在一起否则出了问题非常难排查。v3.8的处理流程大致是这样的前端表单提交Excel文件表单的enctype必须设置为multipart/form-data否则PHP拿不到文件内容后端先校验文件类型和大小再用move_uploaded_file()把文件移动到指定目录调用PHPExcel或PhpSpreadsheet新版本已经兼容读取文件逐行逐列解析把解析结果按照“学期、周次、星期、节次、班级、课程、教师、教室”的维度写入数据库解析完成后在页面上展示导入结果比如“成功导入1200条课表记录跳过3条空数据”这里我建议你部署时打开项目里的import.php看一遍它把上传和解析分成了两个函数upload_file()处理文件校验和移动parse_excel_to_array()负责读取和转换。这样的好处是如果上传失败不用去查解析逻辑如果解析报错也不会影响文件本身。2.3 课表数据的核心表结构一张表就能撑起查询v3.8的数据库设计非常精简它没有搞复杂的外键关联而是用一张timetable表把所有课表信息存下来核心字段大概是这样的字段名类型说明idint(11)主键自增termvarchar(20)学期如“2024-2025-1”week_starttinyint(4)起始周week_endtinyint(4)结束周week_typevarchar(10)周类型区分单周、双周、全周day_of_weektinyint(4)星期几1-7sectionvarchar(20)节次如“1-2节”course_namevarchar(100)课程名称teachervarchar(50)授课教师classroomvarchar(50)上课教室class_namevarchar(100)上课班级多个班级用逗号分隔extratext扩展字段存放备注信息为什么把班级字段设计成“逗号分隔”而不是单独建一张关联表这是从实际使用场景出发的合班上课非常普遍两个班一起上大课如果用关联表查询时要多关联一次灵活性是高一些但开发复杂度也上来了。而逗号分隔配合MySQL的FIND_IN_SET()函数完全够用还直观好维护。这个取舍在中小型项目里是对的——先解决80%的典型问题剩下20%的边界情况等遇到再说。2.4 查询引擎实现多维检索没有那么神秘查询功能是系统的门面v3.8支持按班级查、按教师查、按教室查三个维度。这三个维度背后的查询逻辑本质上是一样的根据URL参数拼接WHERE条件从MySQL里查出符合条件的记录再按星期和节次排列成二维数组。比如说按班级查询的URL是index.php?actionclassname计算机2301后端代码大致会做这样几件事$class isset($_GET[name]) ? trim($_GET[name]) : ; $where FIND_IN_SET( . addslashes($class) . , class_name) ; $sql SELECT * FROM timetable WHERE term $term AND $where ORDER BY day_of_week, section_id;这里有一个细节值得说一下课表查询的输出格式不是简单的表格列表而是“行是星期列是节次”的矩阵表格也就是我们在学校宣传栏里看到的那种课表形态。为了从数据库行记录转换成矩阵表格代码里做了一个很关键的数组重组操作// 初始化一个二维数组7行星期一到日每一天下面挂12节课 $matrix array(); for ($d 1; $d 7; $d) { $matrix[$d] array_fill(1, 12, ); } // 遍历查询结果把课程填充到对应位置 foreach ($rows as $row) { $matrix[$row[day_of_week]][$row[section_id]] $row[course_name]; }这段逻辑看起来简单但如果你没有提前在脑子里把“数据库行记录”和“课表矩阵”这两个模型对应起来写出来的代码很容易在循环里绕晕。我当时自己写的时候卡了一个晚上后来发现其实就是两件事先初始化一个“空课表”再逐个把课程“填进去”。记住这个思路课表类项目的核心代码你就掌握了。3. 实操记录半小时搭起一套可用的课表查询3.1 环境准备与目录结构解读部署这套系统PHP环境是必须的。v3.8是相对老牌的项目结构最佳运行环境是PHP 5.6到PHP 7.4之间Nginx或Apache都行MySQL 5.7以上。如果你用的是宝塔面板直接在软件商店安装PHP 7.2和MySQL 5.7即可。解压后你会看到这样一套目录结构├── index.php // 查询入口页包含班级/教师/教室查询 ├── import.php // Excel上传与解析导入页 ├── config.php // 数据库连接与全局配置 ├── inc/ │ ├── db.php // 数据库操作封装 │ ├── excel.php // Excel解析核心类 │ └── function.php // 公共函数库 ├── uploads/ // Excel上传文件存放目录 ├── sql/ │ └── timetable.sql // 数据库初始化脚本 └── template/ ├── query_form.html // 查询表单模板 └── timetable_table.html // 课表展示模板我建议你拿到项目后先不要急着打开浏览器先按顺序做三件事导入sql/timetable.sql创建数据库修改config.php里的数据库账号密码确认uploads/目录有写入权限权限设为755owner设为www用户。这三件事做完系统就完成了一半。3.2 Excel模板格式这是最关键的约定系统虽然叫“通用课表查询系统”但“通用”不意味着“随便传个Excel就能解析”。它需要遵循一定的模板格式。v3.8默认支持的Excel结构是第一行标题内容可以随意会被跳过第二行表头包含“班级、星期一、星期二、星期三、星期四、星期五”等列第三行起左侧是节次右侧是课程内容课程内容的单元格里通常用换行或斜杠分隔课程名、教师、教室比如“高等数学 张老师 三教201”。系统解析时会按空格分割按顺序去匹配课程、教师、教室三个字段。如果你拿到的课表格式不是这样也不用慌v3.8在inc/excel.php里提供了几个格式适配函数比如parse_course_cell()就是用来处理不同格式的课程单元格。你可以根据自己学校的实际格式改这个函数里的正则表达式或分隔符。3.3 从上传到查询的完整操作流程我实测一遍完整流程如下第一步准备一个符合格式的Excel课表文件。如果你是第一次测试可以直接在系统根目录的demo/文件夹里找到示例课表demo.xlsx用这个文件可以避免格式不匹配的问题。第二步访问http://你的域名/import.php选择文件点击上传。系统会自动把Excel数据导入MySQL并跳转到导入结果页显示“导入成功共X条记录”。第三步访问http://你的域名/index.php?actionclassname计算机2301就会看到该班级这一学期的周课表。切换教师查询把action改成teachername换成教师姓名比如张老师即可。如果你用的是宝塔面板还要特别注意一件事PHP默认的上传文件大小限制是2M而一个包含全校课表的Excel文件很可能超过这个值。需要在PHP配置里把upload_max_filesize和post_max_size都改大建议至少改成32M。否则上传时会提示“文件过大”或直接报500错误排查半天还找不到原因。3.4 关于PHP版本兼容性的经验新版本PHP下的调整方案这年头新装环境基本都是PHP 8.x了而我开头说过这套系统最佳环境是PHP 7.4以下所以很多读者可能会遇到“代码报错跑不起来”的问题。针对PHP 7.4以上版本实测下来主要需要做两处调整第一处PHPExcel库在PHP 8下会报类构造函数兼容性错误。解决办法是换成PhpSpreadsheet或者继续用PHP 7.x版本环境。如果你是老项目不想换库建议直接用宝塔装一个PHP 7.2的版本对这套系统来说完全够用。第二处each()、create_function()这类PHP 7.2后废弃的函数会在PHP 8中直接报致命错误。v3.8里已经对这些函数做了兼容处理但如果你拿到的是更早的版本建议全局搜索each(并手动改成foreach。总体来说只要环境匹配到位这套系统的部署难度不高一个人一下午绝对能跑通。我甚至觉得对于刚开始接触PHP项目的人来说它是很好的“第一个完整Web应用”——既有后端逻辑又有前端展示还有文件上传和数据解析麻雀虽小五脏俱全。4. 高频问题排查实录这些坑我替你踩过了4.1 “导入Excel时中文乱码”不是PHP的锅导入时中文乱码是出现频率最高的问题。现象是Excel里明明是“高等数学”导入后数据库里变成“楂橈旗鏁板”。我排查过几回之后发现这个问题的根子不在PHP代码而在文件编码上。Excel文件的编码默认是GBK而PHP端如果用utf-8方式读取Excel内容就会出乱码。v3.8在inc/excel.php里专门处理了这个读取到每个单元格的值后会先用mb_detect_encoding()检测编码再通过mb_convert_encoding()转换成UTF-8。但这个方法不是100%可靠如果检测失败会默认按GBK转码。如果你换了模板还是乱码可以手动在导入前把Excel另存为CSVUTF-8编码再用系统自带的“CSV导入”功能。实测这条路径最稳也最适合处理编码混乱的老文件。4.2 “解析成功但课表是空的”多半是表头匹配问题有次测试时我导入一个课表文件系统提示“导入成功”但前台查询结果为空。当时一度怀疑是SQL语句写错了排查半天发现——是表头里那列的星期名称和代码里预设的不一致。v3.8的代码默认匹配的表头是“星期一、星期二……”可以支持“周一、周二……”和“MON、TUE……”等模式。但如果你的Excel里写的是“礼拜一、礼拜二”这种非常规名称匹配不到后台就会把它当成无效列跳过导致该列所有课表记录都没导进去。排查方法很简单导入后先看一眼后台返回的“列匹配结果”系统会把每一个Excel列对应到数据库哪个字段打印出来。如果看到“column 3 null”十有八九是这列的表头名称没被识别。去inc/excel.php的match_header()函数里加一行对应的映射即可。4.3 “单双周”课程显示不正常学校课表里经常有这种情况高等数学只在单周上体育课只在双周上。如果只按“星期节次”存那查询时显然会出错。v3.8处理单双周的方式是在数据库里增加一个week_type字段可选值为1单周、2双周、0全周。导入时如果Excel单元格里有“单周”或“双周”字样解析函数会自动提取并填入字段。查询时根据当前周数判断是否展示该课程。我踩过的坑是判断题里用了偶数判断结果“第1周”被当成单周没错但“第21周”也被当成了单周而21实际上是单周没错可一旦学期设的是20周第21周根本不应出现在查询范围里。所以代码里除了单双周判断还要判断当前周数是否在week_start和week_end的范围内两个条件同时满足才显示。if ($current_week $row[week_start] $current_week $row[week_end]) { if ($row[week_type] 0 || ($row[week_type] 1 $current_week % 2 1) || ($row[week_type] 2 $current_week % 2 0)) { // 显示课程 } }4.4 合班课程查不到班级怎么办合班课比如计算机2301和软件2302合上的查询是整个系统最容易让人疑惑的点。用户会在查询框输入“计算机2301”结果发现查不到某门合班课。原因在数据格式上合班课的班级字段存储为“计算机2301,软件2302”用FIND_IN_SET(计算机2301, class_name)是能匹配到的。但如果你查询时输入的是“计算机”或者带空格比如“计算机 2301”FIND_IN_SET就无能为力了。这类问题有两个解决思路一是提醒用户精确输入班级全称二是在代码中把班级字段的值提前做一次“去空格处理”然后查询条件中也去掉空格。实测下来第二种方式对用户更友好改动成本也不大值得做。4.5 常见问题速查表问题现象可能原因处理办法上传文件提示超限PHPupload_max_filesize过小修改php.ini配置调到32M导入后中文乱码Excel文件编码非UTF-8使用CSVUTF-8另存后导入导入成功但查询为空表头星期名称不匹配检查match_header()的匹配规则单双周课程显示异常周数判断逻辑有冲突同时判断周次范围与奇偶性合班课查不到输入的班级名不精确查询前做去空格处理页面报500错误PHP版本过高或权限不足切换PHP 7.2环境检查uploads目录权限5. 一些我认为值得再扩展的方向系统本身已经可以正常使用了但你在实际部署过程中肯定会遇到一些个性化的需求。我根据自己的使用体会列几个可以直接在v3.8基础上扩展的方向。第一个是多学期数据管理。目前系统默认查询最新的导入数据如果你想支持“切换学期查看历史课表”需要给课表数据加上单独的学期字段并在查询表单中增加学期下拉选择器。这个改动不复杂核心就是在lib.php的查询函数里把term作为一个查询条件拼接进去。第二个是教室冲突检测。教务排课的人最怕教室冲突同一间教室同一时间安排了两门课。如果系统能提供一个“按教室查课表”的页面再在导入时自动检测同一教室、同一时间段的记录是否重复就能极大减少人工核对的工作量。v3.8目前没有内置这个功能但查询逻辑已经支持按教室维度查加一个检测脚本并不难。第三个是导出与打印功能。课表查询结果如果能导出成带格式的Excel或打印成PDF老师就能直接下载后当作自己的教学日程表了。这个功能可以用PHPExcel自带的方法实现查询结果填充到新的Excel模板中然后export()下载。实际上就是把导入流程倒过来做一遍语法上很对称。第四个方向可能超出PHP的范畴了但也值得说一句如果学校有企业微信或钉钉可以通过webhook把课表查询入口做成一个“移动端H5页面”或“机器人指令”。这样师生不用打开电脑在手机上就能直接查课表。v3.8的页面本身是响应式布局在手机上打开也能正常显示接个入口就行不需要改核心代码。6. 我的实操体会与建议最后说说我的总体感受吧。这套系统我前前后后部署过两次第一次是在一台老旧的Windows服务器上PHP 5.6 Apache MySQL跑得稳稳当当第二次是迁到Linux服务器上换成PHP 7.2 Nginx MySQL中间遇到过一次库加载不兼容的问题但调整版本后也顺利运行了。它最大的优点不在于代码写得多漂亮而在于切中了“课表查询”这个场景的实际痛点数据维护零门槛、查询入口简单直接、部署成本低。对很多预算不多、技术人员配备也有限的学校或培训机构来说这类轻量级系统比采购大型教务系统更现实、更好用。如果你是要拿它二次开发我建议重点关注inc/excel.php这个文件它封装了Excel解析的全部核心逻辑读懂了它你就掌握了PHP读写Excel的精髓。再配合官方文档查PhpSpreadsheet的API文档完全可以从这个项目出发做出一个带排课审核、调课申请、教师课表推送的完整教务小系统。我做这个项目最大的收获不是学会了PHPExcel怎么用而是明白了“通用”这两个字的真正含义——不是代码写得多么万能而是把常见的变化点都留好了扩展入口让使用者不需要改一行代码也能适配自己的数据格式。这一点对任何开发工作都适用。本文还有配套的精品资源点击获取
返回列表