一个基于 Streamlit 的智能排座系统,用于会议、论坛、活动等场景的座位安排。支持 Excel 导入、自动排座、手动调整、双向联动、撤销/重做、Excel/Word 导出等功能。
- ✅ Excel 导入: 支持上传 .xlsx 格式文件,自动识别列名
- ✅ 智能列选择: 可选择任意一列作为姓名顺序列
- ✅ 空值处理: 自动忽略空单元格,去除前后空格
- ✅ 左侧名单编辑: 支持新增、删除、编辑、排序操作
- ✅ 右侧座位表: 可视化显示座位分配,支持手动调整
- ✅ 左右双向联动: 左改右跟、右改左跟,数据实时同步
- ✅ 手动换位: 选择两个座位进行交换,支持移动到空位
- ✅ 搜索功能: 按姓名模糊搜索,高亮显示匹配结果
- ✅ 撤销/重做: 最多支持 50 步历史操作的撤销和重做
- ✅ Excel 导出: 导出包含 3 个工作表的完整座位表
- ✅ Word 导出: 导出适合打印的 Word 文档
- ✅ 数据校验: 导出前自动校验数据完整性
- Python 3.8+
- pip 或 conda
- 现代浏览器(Chrome、Edge、Firefox)
方法一:使用 pip(推荐)
# 进入项目目录 cd d:\TREA\new # 安装依赖 pip install -r requirements.txt
方法二:使用 conda(如用户要求在 test1 环境)
# 创建环境(如果不存在) conda create -n test1 python=3.10 # 激活环境 conda activate test1 # 安装依赖 cd d:\TREA\new pip install -r requirements.txt
# 激活环境(如使用 conda) conda activate test1 # 进入项目目录 cd d:\TREA\new # 启动 Streamlit 应用 streamlit run app.py
启动后,浏览器会自动打开 http://localhost:8501
系统支持导入标准的 Excel 文件(.xlsx 格式)。
功能特点:
- 自动识别 Excel 列名
- 支持预览前 10 行数据
- 兼容无表头的 Excel(自动用 A列、B列 作为列名)
- 自动检测空值比例,过高时给出警告
导入要求:
- 文件格式:仅限 .xlsx(不支持旧版 .xls)
- 文件大小:建议不超过 10MB
- 至少包含一列姓名数据
上传 Excel 后,用户需要从下拉框中选择哪一列作为姓名顺序列。
处理逻辑:
- 自动忽略空白单元格
- 去除姓名前后空格
- 转换为字符串类型
- 按 Excel 中的原有顺序生成名单
- 检测重复姓名并给出提示
- 为每个人员生成唯一的
person_id
左侧面板显示当前姓名顺序列表,支持丰富的编辑操作。
可用操作:
| 操作 | 说明 |
|---|---|
| ↑ 上移 | 将选中人员上移一位 |
| ↓ 下移 | 将选中人员下移一位 |
| 🔝 置顶 | 将选中人员移动到最顶部 |
| 🔚 置底 | 将选中人员移动到最底部 |
| ✏️ 编辑 | 修改当前人员的姓名 |
| 📍 移到 | 输入目标位置后移动 |
| 🗑️ 删除 | 删除当前人员 |
其他功能:
- 显示人员当前座位信息
- 搜索结果高亮显示
- 点击人员时右侧对应座位高亮
右侧面板以可视化方式显示座位表。
显示规则:
- 按排号从上到下显示
- 每排中间有明显的红色分隔线
- 左侧座位从大到小排列(左4、左3、左2、左1)
- 右侧座位从小到大排列(右1、右2、右3、右4)
交换座位功能:
- 点击 "🔄 交换座位" 按钮进入交换模式
- 点击第一个座位(源座位)
- 点击第二个座位(目标座位)
- 系统自动完成交换并更新左侧顺序
编辑功能:
- 点击座位下方的 "✏️" 可编辑该座位上的姓名
- 编辑后左侧名单同步更新
这是本系统最核心的特性之一。
当左侧名单发生变化时,右侧座位表立即同步更新:
- 人员上移/下移 → 座位重新分配
- 人员删除 → 座位清空,后续人员前移
- 人员新增 → 添加到末尾,如座位足够则分配
- 姓名修改 → 对应座位姓名同步更新
当右侧座位表发生变化时,左侧名单顺序同步更新:
- 交换两个座位 → 左侧名单顺序相应调整
- 将某人移动到空位 → 左侧顺序重新计算
- 修改座位上的姓名 → 左侧对应人员姓名更新
核心逻辑: 左侧名单的顺序始终代表"当前实际排座顺序"。
系统支持按姓名进行模糊搜索。
搜索规则:
- 不区分大小写
- 支持部分匹配
- 所有匹配项都会高亮显示
高亮效果:
- 左侧列表中匹配的人员高亮(橙色背景)
- 右侧对应座位高亮(橙色边框)
- 如果搜索内容不存在,显示"未找到匹配人员"提示
系统支持完整的撤销/重做功能,最多保存 50 步历史。
会保存状态的操作:
- 导入 Excel
- 选择姓名列
- 生成座位表
- 编辑姓名
- 新增/删除人员
- 调整顺序(上移、下移、置顶、置底)
- 手动换位
- 修改每排人数配置
使用方式:
- 点击 "↩ 撤销" 恢复到上一个状态
- 点击 "↪ 重做" 恢复最近一次被撤销的状态
- 按钮会在无法操作时自动禁用
系统支持导出 Excel 和 Word 两种格式。
导出前校验:
- 是否有人未安排座位
- 是否存在空白姓名
- 是否人数超过座位数
- 是否存在重复姓名(提醒即可,不强制阻止)
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 1.上传Excel │───▶│ 2.选择姓名列 │───▶│ 3.编辑名单 │
└─────────────┘ └─────────────┘ └─────────────┘
│
▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 7.导出文件 │◀───│ 6.手动调整 │◀───│ 5.生成座位表│
└─────────────┘ └─────────────┘ └─────────────┘
- 点击页面顶部的 "上传Excel文件" 区域
- 选择你的 .xlsx 文件
- 等待上传完成,系统会显示读取结果
- 在 "选择姓名列" 下拉框中,选择包含姓名的那一列
- 系统会自动提取该列的姓名数据
- 查看提示信息,确认提取是否成功
- 在左侧名单区域检查人员顺序
- 如需调整,使用上移、下移、置顶、置底等按钮
- 可直接编辑姓名或删除不需要的人员
- 可手动添加新人员
- 设置总排数(默认 3 排)
- 为每排设置座位数(默认每排 16 人)
- 例如:第1排16人,第2排16人,第3排16人
- 点击 "✨ 生成座位表" 按钮
- 系统会根据排座规则自动分配座位
- 查看右侧座位表,确认分配结果
- 如需调整座位,点击 "🔄 交换座位" 进入交换模式
- 依次点击两个座位完成交换
- 或直接编辑座位上的姓名
- 调整后左侧名单会自动同步
- 点击 "📊 导出Excel" 或 "📄 导出Word"
- 查看校验提示信息
- 点击下载按钮保存文件
座位表以中间区域为分界线,按以下顺序分配:
排座顺序:右1 → 左1 → 右2 → 左2 → 右3 → 左3 → 右4 → 左4 → ...
| 分配顺序 | 座位位置 | 说明 |
|---|---|---|
| 第 1 位 | 右 1 | 中间右侧第 1 个座位 |
| 第 2 位 | 左 1 | 中间左侧第 1 个座位 |
| 第 3 位 | 右 2 | 右侧第 2 个座位 |
| 第 4 位 | 左 2 | 左侧第 2 个座位 |
| 第 5 位 | 右 3 | 右侧第 3 个座位 |
| 第 6 位 | 左 3 | 左侧第 3 个座位 |
| ... | ... | 依次向外扩展 |
虽然排座顺序是"右1、左1、右2、左2...",但在界面上座位按物理位置显示:
从左到右的物理顺序:
左4 → 左3 → 左2 → 左1 → 【中间】 → 右1 → 右2 → 右3 → 右4
如果某排人数为奇数,系统会:
- 右侧比左侧多 1 个座位
- 中间的座位属于右侧
- 仍然保持"先右后左"的分配顺序
示例:7 人一排
- 右侧:4 个座位(右1、右2、右3、右4)
- 左侧:3 个座位(左1、左2、左3)
- 分配顺序:右1→左1→右2→左2→右3→左3→右4
显示名称格式:
- 第 N 排右 M(如:第1排右1、第2排左3)
内部 seat_id 格式:
- R{排号}{侧}{座位号}
- 示例:R1_RIGHT_1、R2_LEFT_3、R3_RIGHT_5
系统默认配置为 3 排,每排 16 人:
| 排号 | 座位数 |
|---|---|
| 第 1 排 | 16 |
| 第 2 排 | 16 |
| 第 3 排 | 16 |
用户可以根据实际需要自定义配置:
- 调整总排数:在 "总排数" 输入框中修改
- 调整每排人数:为每排单独设置座位数
- 生成座位表:点击按钮后配置生效
示例 1:论坛式配置
第 1 排:20 人(主席台)
第 2 排:18 人
第 3 排:18 人
第 4 排:16 人
第 5 排:16 人
示例 2:小型会议配置
第 1 排:10 人
第 2 排:10 人
第 3 排:8 人
示例 3:测试配置(与 TESTING.md 一致)
第 1 排:8 人
第 2 排:8 人
第 3 排:8 人
第 4 排:6 人
总座位:30 个
| 情况 | 处理方式 |
|---|---|
| 人数 = 座位数 | 全部人员安排座位 |
| 人数 < 座位数 | 安排所有人,多余座位留空 |
| 人数 > 座位数 | 只安排前 N 人(N为座位数),其余人不安排,给出警告 |
导出的 Excel 文件包含 3 个工作表:
以可视化方式展示座位安排:
┌─────────────────────────────────────────────────────────┐
│ 第 1 排 │
├──────┬──────┬──────┬──────┬────────┬──────┬──────┬─────┤
│ 左4 │ 左3 │ 左2 │ 左1 │ 【中间】│ 右1 │ 右2 │ ...│
│ 黄婷 │ 杨敏 │ 刘洋 │ 王芳 │ │ 张伟 │ 李娜 │ ...│
└──────┴──────┴──────┴──────┴────────┴──────┴──────┴─────┘
特点:
- 按排号从上到下显示
- 每排有标题行
- 中间有黄色高亮的分隔区域
- 左侧座位倒序排列,右侧正序排列
按左侧名单顺序列出所有人员:
| 当前顺序号 | 姓名 | 当前座位 |
|---|---|---|
| 1 | 张伟 | 第1排右1 |
| 2 | 王芳 | 第1排左1 |
| 3 | 李娜 | 第1排右2 |
| ... | ... | ... |
用途: 用于了解当前实际排座顺序,适合打印名单。
按排座顺序的详细表格:
| 全局顺序号 | 排号 | 左右侧 | 座位编号 | 显示名称 | 姓名 |
|---|---|---|---|---|---|
| 1 | 第1排 | 右侧 | 1 | 第1排右1 | 张伟 |
| 2 | 第1排 | 左侧 | 1 | 第1排左1 | 王芳 |
| 3 | 第1排 | 右侧 | 2 | 第1排右2 | 李娜 |
| ... | ... | ... | ... | ... | ... |
用途: 用于详细分析座位分配情况,是最完整的数据导出。
导出的 Word 文档包含两部分:
与 Excel 的工作表 1 类似,以表格形式展示:
第 1 排
┌──────┬──────┬──────┬──────┬────────┬──────┬──────┐
│ 左4 │ 左3 │ 左2 │ 左1 │ 【中间】│ 右1 │ 右2 │...
│ 黄婷 │ 杨敏 │ 刘洋 │ 王芳 │ │ 张伟 │ 李娜 │...
└──────┴──────┴──────┴──────┴────────┴──────┴──────┘
与 Excel 的工作表 3 类似:
| 全局顺序号 | 排号 | 左右侧 | 座位编号 | 显示名称 | 姓名 |
|---|---|---|---|---|---|
| 1 | 第1排 | 右侧 | 1 | 第1排右1 | 张伟 |
| 2 | 第1排 | 左侧 | 1 | 第1排左1 | 王芳 |
| ... | ... | ... | ... | ... | ... |
特点:
- 使用宋体字体
- 表格带边框
- 适合直接打印或进一步编辑
d:\TREA\new\
├── app.py # 主应用入口(Streamlit 界面)
├── requirements.txt # Python 依赖列表
├── README.md # 项目说明文档
├── TESTING.md # 测试文档与用例
└── utils/ # 工具模块目录
├── __init__.py # 模块初始化
├── parser.py # Excel 解析与列选择
├── seating.py # 核心排座算法
├── history.py # 撤销/重做历史管理
├── exporter.py # Excel/Word 导出
└── state_manager.py # 状态管理与同步逻辑
| 模块 | 主要职责 |
|---|---|
app.py |
Streamlit 界面渲染、用户交互处理、调用各工具模块 |
utils/parser.py |
Excel 文件读取、列名识别、姓名数据提取、空值处理 |
utils/seating.py |
座位结构生成、排座算法、座位分配、交换逻辑 |
utils/history.py |
状态快照、撤销栈、重做栈、历史记录管理 |
utils/exporter.py |
Excel/Word 文档生成、数据校验、表格格式化 |
utils/state_manager.py |
应用状态封装、人员管理、座位管理、搜索功能 |
| 技术 | 版本 | 用途 |
|---|---|---|
| Python | 3.8+ | 核心开发语言 |
| Streamlit | 1.28.0+ | Web 应用框架 |
| 技术 | 用途 |
|---|---|
| pandas | Excel 数据读取与处理 |
| openpyxl | Excel 文件读写(.xlsx 格式) |
| 技术 | 用途 |
|---|---|
| python-docx | Word 文档生成 |
| 技术 | 用途 |
|---|---|
| python-dateutil | 日期处理 |
| uuid | 生成唯一标识符 |
建议 Excel 文件包含以下列(至少包含姓名列):
| 列名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| 序号 | 数字 | 否 | 用于参考,不作为排座顺序 |
| 姓名 | 文本 | 是 | 排座的主要依据 |
| 部门 | 文本 | 否 | 辅助信息,不影响排座 |
| 职位 | 文本 | 否 | 辅助信息,不影响排座 |
| 备注 | 文本 | 否 | 其他说明 |
| 序号 | 姓名 | 部门 | 职位 |
|---|---|---|---|
| 1 | 张伟 | 技术部 | 经理 |
| 2 | 王芳 | 市场部 | 主管 |
| 3 | 李娜 | 人事部 | 专员 |
| 4 | 刘洋 | 财务部 | 主管 |
| 5 | 陈杰 | 技术部 | 工程师 |
| ... | ... | ... | ... |
-
列名识别:系统会自动识别第一行作为列名。如果没有表头,系统会用 A列、B列、C列...作为列名。
-
空值处理:
- 空白单元格会被自动忽略
- 只包含空格的单元格也会被忽略
- 如果空值比例超过 30%,系统会给出警告
-
数据类型:
- 姓名会被转换为字符串类型
- 数字类型的姓名(如工号)也会被转换为字符串
-
重复姓名:
- 系统允许重复姓名
- 会给出"存在重复姓名"的提示
- 内部使用唯一的
person_id区分,不会混淆
-
排座顺序:
- 严格按照 Excel 中的行顺序排列
- 第一行(表头后)是第 1 位,第二行是第 2 位,依此类推
发布日期: 2026年04月24日
新增功能:
- ✅ 基础框架搭建完成
- ✅ Excel 导入功能
- ✅ 姓名列选择功能
- ✅ 左侧名单编辑(新增、删除、编辑、排序)
- ✅ 右侧座位表显示
- ✅ 核心排座算法(右1、左1、右2、左2...)
- ✅ 左右双向联动(左改右跟、右改左跟)
- ✅ 手动换位功能
- ✅ 搜索功能(模糊匹配、高亮显示)
- ✅ 撤销/重做功能(最多 50 步)
- ✅ Excel 导出(3 个工作表)
- ✅ Word 导出
- ✅ 数据校验功能
- ✅ 完整的测试文档
- ✅ 完整的说明文档
技术特性:
- 清晰的模块化架构
- 完善的中文注释
- 稳定的状态管理
- 深拷贝的历史快照
- 丰富的 CSS 样式
A: 仅支持 .xlsx 格式(Excel 2007 及以上版本)。不支持旧版 .xls 格式。如有需要,请先用 Excel 另存为 .xlsx 格式。
A: 系统会自动检测。如果检测到可能没有表头,会使用 A列、B列、C列...作为列名。用户仍可选择任意列作为姓名列。
A: 可以。系统内部使用唯一的 person_id 区分每个人,不会因为姓名相同而混淆。但会给出"存在重复姓名"的提示,建议用户确认。
A: 系统会只安排前 N 个人(N 为座位数),多余的人不会被分配座位。同时会给出警告提示。建议增加座位数或减少人员。
A: 默认最多保存 50 步历史操作。超过后,最早的操作会被丢弃。
A: 点击导出按钮后,系统会在页面上生成一个下载按钮。点击下载按钮后,文件会下载到浏览器的默认下载目录。
A: 按照以下步骤操作:
conda activate test1 cd d:\TREA\new pip install -r requirements.txt streamlit run app.py
如有问题或建议,请查看 TESTING.md 获取测试用例,或参考项目代码中的注释。
文档版本: 1.0
最后更新: 2026年04月24日