Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Seagull-Ling/new

Repository files navigation

🪑 智能排座系统

一个基于 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 导入

系统支持导入标准的 Excel 文件(.xlsx 格式)。

功能特点:

  • 自动识别 Excel 列名
  • 支持预览前 10 行数据
  • 兼容无表头的 Excel(自动用 A列、B列 作为列名)
  • 自动检测空值比例,过高时给出警告

导入要求:

  • 文件格式:仅限 .xlsx(不支持旧版 .xls)
  • 文件大小:建议不超过 10MB
  • 至少包含一列姓名数据

姓名列选择

上传 Excel 后,用户需要从下拉框中选择哪一列作为姓名顺序列。

处理逻辑:

  1. 自动忽略空白单元格
  2. 去除姓名前后空格
  3. 转换为字符串类型
  4. 按 Excel 中的原有顺序生成名单
  5. 检测重复姓名并给出提示
  6. 为每个人员生成唯一的 person_id

左侧名单编辑

左侧面板显示当前姓名顺序列表,支持丰富的编辑操作。

可用操作:

操作 说明
↑ 上移 将选中人员上移一位
↓ 下移 将选中人员下移一位
🔝 置顶 将选中人员移动到最顶部
🔚 置底 将选中人员移动到最底部
✏️ 编辑 修改当前人员的姓名
📍 移到 输入目标位置后移动
🗑️ 删除 删除当前人员

其他功能:

  • 显示人员当前座位信息
  • 搜索结果高亮显示
  • 点击人员时右侧对应座位高亮

右侧座位表

右侧面板以可视化方式显示座位表。

显示规则:

  • 按排号从上到下显示
  • 每排中间有明显的红色分隔线
  • 左侧座位从大到小排列(左4、左3、左2、左1)
  • 右侧座位从小到大排列(右1、右2、右3、右4)

交换座位功能:

  1. 点击 "🔄 交换座位" 按钮进入交换模式
  2. 点击第一个座位(源座位)
  3. 点击第二个座位(目标座位)
  4. 系统自动完成交换并更新左侧顺序

编辑功能:

  • 点击座位下方的 "✏️" 可编辑该座位上的姓名
  • 编辑后左侧名单同步更新

左右双向联动

这是本系统最核心的特性之一。

左改右跟

当左侧名单发生变化时,右侧座位表立即同步更新:

  • 人员上移/下移 → 座位重新分配
  • 人员删除 → 座位清空,后续人员前移
  • 人员新增 → 添加到末尾,如座位足够则分配
  • 姓名修改 → 对应座位姓名同步更新

右改左跟

当右侧座位表发生变化时,左侧名单顺序同步更新:

  • 交换两个座位 → 左侧名单顺序相应调整
  • 将某人移动到空位 → 左侧顺序重新计算
  • 修改座位上的姓名 → 左侧对应人员姓名更新

核心逻辑: 左侧名单的顺序始终代表"当前实际排座顺序"。

搜索功能

系统支持按姓名进行模糊搜索。

搜索规则:

  • 不区分大小写
  • 支持部分匹配
  • 所有匹配项都会高亮显示

高亮效果:

  • 左侧列表中匹配的人员高亮(橙色背景)
  • 右侧对应座位高亮(橙色边框)
  • 如果搜索内容不存在,显示"未找到匹配人员"提示

撤销/重做

系统支持完整的撤销/重做功能,最多保存 50 步历史。

会保存状态的操作:

  • 导入 Excel
  • 选择姓名列
  • 生成座位表
  • 编辑姓名
  • 新增/删除人员
  • 调整顺序(上移、下移、置顶、置底)
  • 手动换位
  • 修改每排人数配置

使用方式:

  • 点击 "↩ 撤销" 恢复到上一个状态
  • 点击 "↪ 重做" 恢复最近一次被撤销的状态
  • 按钮会在无法操作时自动禁用

导出功能

系统支持导出 Excel 和 Word 两种格式。

导出前校验:

  • 是否有人未安排座位
  • 是否存在空白姓名
  • 是否人数超过座位数
  • 是否存在重复姓名(提醒即可,不强制阻止)

使用流程

标准工作流程

┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 1.上传Excel │───▶│ 2.选择姓名列 │───▶│ 3.编辑名单 │
└─────────────┘ └─────────────┘ └─────────────┘
 │
 ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 7.导出文件 │◀───│ 6.手动调整 │◀───│ 5.生成座位表│
└─────────────┘ └─────────────┘ └─────────────┘

详细步骤

第一步:上传 Excel 文件

  1. 点击页面顶部的 "上传Excel文件" 区域
  2. 选择你的 .xlsx 文件
  3. 等待上传完成,系统会显示读取结果

第二步:选择姓名列

  1. 在 "选择姓名列" 下拉框中,选择包含姓名的那一列
  2. 系统会自动提取该列的姓名数据
  3. 查看提示信息,确认提取是否成功

第三步:编辑名单(可选)

  1. 在左侧名单区域检查人员顺序
  2. 如需调整,使用上移、下移、置顶、置底等按钮
  3. 可直接编辑姓名或删除不需要的人员
  4. 可手动添加新人员

第四步:配置每排人数

  1. 设置总排数(默认 3 排)
  2. 为每排设置座位数(默认每排 16 人)
  3. 例如:第1排16人,第2排16人,第3排16人

第五步:生成座位表

  1. 点击 "✨ 生成座位表" 按钮
  2. 系统会根据排座规则自动分配座位
  3. 查看右侧座位表,确认分配结果

第六步:手动调整(可选)

  1. 如需调整座位,点击 "🔄 交换座位" 进入交换模式
  2. 依次点击两个座位完成交换
  3. 或直接编辑座位上的姓名
  4. 调整后左侧名单会自动同步

第七步:导出文件

  1. 点击 "📊 导出Excel" 或 "📄 导出Word"
  2. 查看校验提示信息
  3. 点击下载按钮保存文件

排座规则详解

核心排座规则

座位表以中间区域为分界线,按以下顺序分配:

排座顺序:右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. 调整总排数:在 "总排数" 输入框中修改
  2. 调整每排人数:为每排单独设置座位数
  3. 生成座位表:点击按钮后配置生效

配置示例

示例 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 导出内容

导出的 Excel 文件包含 3 个工作表:

工作表 1:正式座位表

以可视化方式展示座位安排:

┌─────────────────────────────────────────────────────────┐
│ 第 1 排 │
├──────┬──────┬──────┬──────┬────────┬──────┬──────┬─────┤
│ 左4 │ 左3 │ 左2 │ 左1 │ 【中间】│ 右1 │ 右2 │ ...│
│ 黄婷 │ 杨敏 │ 刘洋 │ 王芳 │ │ 张伟 │ 李娜 │ ...│
└──────┴──────┴──────┴──────┴────────┴──────┴──────┴─────┘

特点:

  • 按排号从上到下显示
  • 每排有标题行
  • 中间有黄色高亮的分隔区域
  • 左侧座位倒序排列,右侧正序排列

工作表 2:当前姓名顺序表

按左侧名单顺序列出所有人员:

当前顺序号 姓名 当前座位
1 张伟 第1排右1
2 王芳 第1排左1
3 李娜 第1排右2
... ... ...

用途: 用于了解当前实际排座顺序,适合打印名单。

工作表 3:座位分配明细表

按排座顺序的详细表格:

全局顺序号 排号 左右侧 座位编号 显示名称 姓名
1 第1排 右侧 1 第1排右1 张伟
2 第1排 左侧 1 第1排左1 王芳
3 第1排 右侧 2 第1排右2 李娜
... ... ... ... ... ...

用途: 用于详细分析座位分配情况,是最完整的数据导出。

Word 导出内容

导出的 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 的格式说明

推荐格式

建议 Excel 文件包含以下列(至少包含姓名列):

列名 类型 必填 说明
序号 数字 用于参考,不作为排座顺序
姓名 文本 排座的主要依据
部门 文本 辅助信息,不影响排座
职位 文本 辅助信息,不影响排座
备注 文本 其他说明

示例 Excel 内容

序号 姓名 部门 职位
1 张伟 技术部 经理
2 王芳 市场部 主管
3 李娜 人事部 专员
4 刘洋 财务部 主管
5 陈杰 技术部 工程师
... ... ... ...

注意事项

  1. 列名识别:系统会自动识别第一行作为列名。如果没有表头,系统会用 A列、B列、C列...作为列名。

  2. 空值处理:

    • 空白单元格会被自动忽略
    • 只包含空格的单元格也会被忽略
    • 如果空值比例超过 30%,系统会给出警告
  3. 数据类型:

    • 姓名会被转换为字符串类型
    • 数字类型的姓名(如工号)也会被转换为字符串
  4. 重复姓名:

    • 系统允许重复姓名
    • 会给出"存在重复姓名"的提示
    • 内部使用唯一的 person_id 区分,不会混淆
  5. 排座顺序:

    • 严格按照 Excel 中的行顺序排列
    • 第一行(表头后)是第 1 位,第二行是第 2 位,依此类推

更新日志

v1.0.0(当前版本)

发布日期: 2026年04月24日

新增功能:

  • ✅ 基础框架搭建完成
  • ✅ Excel 导入功能
  • ✅ 姓名列选择功能
  • ✅ 左侧名单编辑(新增、删除、编辑、排序)
  • ✅ 右侧座位表显示
  • ✅ 核心排座算法(右1、左1、右2、左2...)
  • ✅ 左右双向联动(左改右跟、右改左跟)
  • ✅ 手动换位功能
  • ✅ 搜索功能(模糊匹配、高亮显示)
  • ✅ 撤销/重做功能(最多 50 步)
  • ✅ Excel 导出(3 个工作表)
  • ✅ Word 导出
  • ✅ 数据校验功能
  • ✅ 完整的测试文档
  • ✅ 完整的说明文档

技术特性:

  • 清晰的模块化架构
  • 完善的中文注释
  • 稳定的状态管理
  • 深拷贝的历史快照
  • 丰富的 CSS 样式

常见问题

Q1: 支持哪些 Excel 格式?

A: 仅支持 .xlsx 格式(Excel 2007 及以上版本)。不支持旧版 .xls 格式。如有需要,请先用 Excel 另存为 .xlsx 格式。

Q2: 如果 Excel 没有表头怎么办?

A: 系统会自动检测。如果检测到可能没有表头,会使用 A列、B列、C列...作为列名。用户仍可选择任意列作为姓名列。

Q3: 可以有重复姓名吗?

A: 可以。系统内部使用唯一的 person_id 区分每个人,不会因为姓名相同而混淆。但会给出"存在重复姓名"的提示,建议用户确认。

Q4: 人数超过座位数会怎样?

A: 系统会只安排前 N 个人(N 为座位数),多余的人不会被分配座位。同时会给出警告提示。建议增加座位数或减少人员。

Q5: 撤销/重做最多支持多少步?

A: 默认最多保存 50 步历史操作。超过后,最早的操作会被丢弃。

Q6: 导出的文件保存在哪里?

A: 点击导出按钮后,系统会在页面上生成一个下载按钮。点击下载按钮后,文件会下载到浏览器的默认下载目录。

Q7: 如何在 conda 环境中运行?

A: 按照以下步骤操作:

conda activate test1
cd d:\TREA\new
pip install -r requirements.txt
streamlit run app.py

联系方式

如有问题或建议,请查看 TESTING.md 获取测试用例,或参考项目代码中的注释。


文档版本: 1.0
最后更新: 2026年04月24日

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

Contributors

Languages

AltStyle によって変換されたページ (->オリジナル) /