Compare commits

...

4 Commits

Author SHA1 Message Date
b437f3ffc1 项目基本完成 2025-06-30 21:07:53 +08:00
18d7a4d0a1 Merge remote-tracking branch 'github/master' 2025-06-30 21:07:04 +08:00
0336d55682 项目基本完成 2025-06-30 21:00:51 +08:00
84f11a0906 Create main.yml 2025-06-30 11:08:24 +08:00
4 changed files with 993 additions and 10 deletions

89
.github/workflows/main.yml vendored Normal file
View File

@@ -0,0 +1,89 @@
# GitHub Actions工作流 - 多平台构建
# 将此文件放在 .github/workflows/ 目录下
name: Build Multi-Platform Executables
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
workflow_dispatch:
jobs:
build-windows:
runs-on: windows-latest
strategy:
matrix:
arch: [x64, x86]
steps:
- uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.10'
architecture: ${{ matrix.arch }}
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install pandas openpyxl pyinstaller
- name: Build executable
run: |
pyinstaller --onefile --console --name "座位分配系统_${{ matrix.arch }}" seat_allocation_system.py
- name: Upload artifacts
uses: actions/upload-artifact@v3
with:
name: windows-${{ matrix.arch }}
path: dist/座位分配系统_${{ matrix.arch }}.exe
build-macos:
runs-on: macos-latest
steps:
- uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.10'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install pandas openpyxl pyinstaller
- name: Build executable
run: |
pyinstaller --onefile --console --name "座位分配系统_macos" seat_allocation_system.py
- name: Upload artifacts
uses: actions/upload-artifact@v3
with:
name: macos
path: dist/座位分配系统_macos
create-release:
needs: [build-windows, build-macos]
runs-on: ubuntu-latest
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
steps:
- name: Download all artifacts
uses: actions/download-artifact@v3
- name: Create Release
uses: softprops/action-gh-release@v1
with:
tag_name: v${{ github.run_number }}
name: Release v${{ github.run_number }}
files: |
windows-x64/座位分配系统_x64.exe
windows-x86/座位分配系统_x86.exe
macos/座位分配系统_macos
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

284
Windows部署说明.md Normal file
View File

@@ -0,0 +1,284 @@
# 座位分配系统 - Windows部署说明
## 目录
- [概述](#概述)
- [系统要求](#系统要求)
- [开发者构建指南](#开发者构建指南)
- [用户使用指南](#用户使用指南)
- [故障排除](#故障排除)
- [技术支持](#技术支持)
## 概述
本文档说明如何在Windows系统上构建和部署座位分配系统。该系统支持1-10人连坐需求能够处理不连续座位分配。
**主要功能:**
- 智能座位分配算法
- 支持连坐组合1-10人
- 完整的文件校验
- 详细的分配日志
- 用户友好的命令行界面
## 系统要求
### 开发环境要求
- **操作系统**: Windows 7/10/11 (64位)
- **Python版本**: Python 3.8 或更高版本
- **内存**: 至少 2GB RAM
- **磁盘空间**: 至少 500MB 可用空间
- **网络**: 需要网络连接以下载依赖包
### 运行环境要求(最终用户)
- **操作系统**: Windows 7/10/11 (64位)
- **内存**: 至少 1GB RAM
- **磁盘空间**: 至少 100MB 可用空间
- **Excel**: Microsoft Excel 2010 或更高版本(查看结果文件)
## 开发者构建指南
### 1. 环境准备
#### 1.1 安装Python
从 [Python官网](https://www.python.org/downloads/) 下载并安装Python 3.8+
确保安装时勾选:
- ✅ Add Python to PATH
- ✅ Install pip
#### 1.2 验证安装
```cmd
python --version
pip --version
```
### 2. 下载源代码
```cmd
git clone <repository-url>
cd TableSynthesis
```
### 3. 自动构建(推荐)
#### 3.1 运行构建脚本
```cmd
python windows_build.py
```
构建脚本将自动完成:
- ✅ 检查系统环境
- ✅ 安装必要依赖
- ✅ 构建独立exe文件
- ✅ 创建分发包
#### 3.2 构建输出
构建成功后,会生成:
```
座位分配系统_Windows_分发包/
├── 座位分配系统.exe # 主程序
├── 运行座位分配系统.bat # 启动脚本
├── 使用说明.txt # 使用说明
├── 人员信息_示例.xlsx # 示例文件
└── 座位信息_示例.xlsx # 示例文件
```
### 4. 手动构建(可选)
如果自动构建失败,可以手动构建:
#### 4.1 安装依赖
```cmd
pip install pandas>=1.3.0 openpyxl>=3.0.0 numpy>=1.20.0 pyinstaller>=4.0
```
#### 4.2 使用PyInstaller构建
```cmd
pyinstaller --clean --noconfirm seat_allocation.spec
```
#### 4.3 手动创建分发包
```cmd
mkdir 座位分配系统_Windows_分发包
copy dist\座位分配系统.exe 座位分配系统_Windows_分发包\
copy 人员信息.xlsx 座位分配系统_Windows_分发包\人员信息_示例.xlsx
copy 座位信息.xlsx 座位分配系统_Windows_分发包\座位信息_示例.xlsx
copy 运行座位分配系统.bat 座位分配系统_Windows_分发包\
```
## 用户使用指南
### 1. 获取分发包
从开发者处获取 `座位分配系统_Windows_分发包` 文件夹,或下载已构建的发布版本。
### 2. 准备数据文件
#### 2.1 复制示例文件
```
人员信息_示例.xlsx → 人员信息.xlsx
座位信息_示例.xlsx → 座位信息.xlsx
```
#### 2.2 填写人员信息.xlsx
**必需列:**
- **姓名**: 人员姓名
- **证件类型**: 身份证、护照等
- **证件号**: 证件号码
- **手机号**: 联系电话
- **备注**: 连坐人数(留空表示单独坐)
**连坐规则:**
- 单人坐位:备注列留空
- 连坐组合:第一人填写总人数,其他人留空
**示例:**
| 姓名 | 证件类型 | 证件号 | 手机号 | 备注 |
|------|----------|--------|--------|------|
| 张三 | 身份证 | 123456789012345678 | 13800138000 | 3 |
| 李四 | 身份证 | 123456789012345679 | 13800138001 | |
| 王五 | 身份证 | 123456789012345680 | 13800138002 | |
| 赵六 | 身份证 | 123456789012345681 | 13800138003 | |
上述示例表示张三、李四、王五需要3人连坐赵六单独坐。
#### 2.3 填写座位信息.xlsx
**必需列:**
- **区域**: 座位区域(如"A区"、"B区"
- **楼层**: 楼层信息(如"1层"、"2层"
- **排号**: 排号(如"第1排"、"第2排"
- **座位号**: 具体座位号(如"1号"、"2号"
**示例:**
| 区域 | 楼层 | 排号 | 座位号 |
|------|------|------|--------|
| A区 | 1层 | 第1排 | 1号 |
| A区 | 1层 | 第1排 | 2号 |
| A区 | 1层 | 第1排 | 3号 |
### 3. 运行程序
#### 3.1 推荐方式使用bat脚本
双击 `运行座位分配系统.bat`
脚本会自动:
- ✅ 检查环境和文件
- ✅ 提供友好的错误提示
- ✅ 运行主程序
- ✅ 显示运行结果
#### 3.2 直接运行
双击 `座位分配系统.exe`
### 4. 查看结果
程序运行成功后,会生成以下文件:
- **座位信息_最终分配.xlsx**: 最终座位分配结果
- **最终座位分配日志.xlsx**: 详细分配记录
- **seat_allocation_log.txt**: 运行日志
使用Excel打开xlsx文件查看分配结果。
## 故障排除
### 常见问题
#### Q1: 程序无法启动
**可能原因:**
- 系统不兼容需要Windows 7+
- 缺少Visual C++ Redistributable
**解决方案:**
1. 确认系统版本Windows 7/10/11 64位
2. 下载安装 [Microsoft Visual C++ Redistributable](https://aka.ms/vs/17/release/vc_redist.x64.exe)
#### Q2: 提示缺少依赖包
**可能原因:**
- 网络连接问题
- 权限不足
**解决方案:**
1. 确保网络连接正常
2. 以管理员身份运行
3. 手动安装:`pip install pandas openpyxl numpy`
#### Q3: 文件权限错误
**可能原因:**
- Excel文件被占用
- 程序目录只读
**解决方案:**
1. 关闭所有Excel窗口
2. 确保程序目录有写入权限
3. 避免在系统盘根目录运行
#### Q4: 数据文件格式错误
**可能原因:**
- 列名不匹配
- 数据类型错误
- 编码问题
**解决方案:**
1. 对照示例文件检查列名
2. 确保数据格式正确
3. 使用UTF-8编码保存
#### Q5: 无法找到连续座位
**可能原因:**
- 座位信息不连续
- 连坐组过大
**解决方案:**
1. 检查座位信息的连续性
2. 适当调整连坐组大小
3. 增加座位数量
### 日志分析
查看 `seat_allocation_log.txt` 文件可获取详细错误信息:
- **文件加载错误**: 检查文件路径和格式
- **数据校验错误**: 检查数据完整性
- **分配算法错误**: 检查座位和人员匹配
### 性能优化
#### 大数据处理
- **人员数量**: 建议不超过1000人
- **座位数量**: 建议不超过2000个
- **连坐组大小**: 建议不超过8人
#### 内存使用
- 小型场景(<100人: 约50MB内存
- 中型场景100-500人: 约100MB内存
- 大型场景500-1000人: 约200MB内存
## 技术支持
### 获取帮助
1. **查看日志文件**: `seat_allocation_log.txt`
2. **检查使用说明**: `使用说明.txt`
3. **参考示例文件**: 确保数据格式正确
### 报告问题
报告问题时请提供
- 系统信息操作系统版本
- 错误截图或错误信息
- 数据文件脱敏后
- seat_allocation_log.txt 内容
### 更新与维护
- 定期检查更新版本
- 备份重要数据文件
- 保持系统和依赖包更新
---
**版本**: v1.0
**最后更新**: 2024年12月
**兼容性**: Windows 7/10/11 (64位)

View File

@@ -6,11 +6,91 @@
支持1-10人连坐需求能够处理不连续座位 支持1-10人连坐需求能够处理不连续座位
""" """
import pandas as pd import sys
import numpy as np import os
from pathlib import Path from pathlib import Path
import datetime import datetime
import sys
def check_dependencies():
"""检查并安装必要的依赖包"""
required_packages = {
'pandas': 'pandas>=1.3.0',
'numpy': 'numpy>=1.20.0',
'openpyxl': 'openpyxl>=3.0.0'
}
missing_packages = []
print("检查依赖包...")
for package_name, package_spec in required_packages.items():
try:
__import__(package_name)
print(f"{package_name} 已安装")
except ImportError:
missing_packages.append(package_spec)
print(f"{package_name} 未安装")
if missing_packages:
print(f"\n发现缺失依赖: {', '.join(missing_packages)}")
print("正在尝试自动安装...")
try:
import subprocess
for package in missing_packages:
print(f"安装 {package}...")
result = subprocess.run([sys.executable, '-m', 'pip', 'install', package],
capture_output=True, text=True)
if result.returncode == 0:
print(f"{package} 安装成功")
else:
print(f"{package} 安装失败: {result.stderr}")
return False
except Exception as e:
print(f"❌ 自动安装失败: {e}")
print("\n请手动安装以下依赖包:")
for package in missing_packages:
print(f" pip install {package}")
input("安装完成后按Enter键继续...")
return False
return True
def check_data_files():
"""检查必要的数据文件"""
required_files = ['人员信息.xlsx', '座位信息.xlsx']
missing_files = []
print("\n检查数据文件...")
for file_name in required_files:
if Path(file_name).exists():
print(f"{file_name} 存在")
else:
missing_files.append(file_name)
print(f"{file_name} 不存在")
if missing_files:
print(f"\n❌ 缺少必要文件: {', '.join(missing_files)}")
print("\n请确保以下文件存在于程序同一目录下:")
print("1. 人员信息.xlsx - 包含姓名、证件类型、证件号、手机号、备注等列")
print("2. 座位信息.xlsx - 包含区域、楼层、排号、座位号等列")
print("\n提示: 您可以参考示例文件来准备数据")
return False
return True
# 只有在依赖检查通过后才导入这些包
if check_dependencies():
try:
import pandas as pd
import numpy as np
except ImportError as e:
print(f"❌ 导入依赖包失败: {e}")
input("按Enter键退出...")
sys.exit(1)
else:
print("❌ 依赖检查失败")
input("按Enter键退出...")
sys.exit(1)
class Logger: class Logger:
"""日志记录器""" """日志记录器"""
@@ -32,7 +112,7 @@ class Logger:
try: try:
with open(self.log_file, 'w', encoding='utf-8') as f: with open(self.log_file, 'w', encoding='utf-8') as f:
f.write('\n'.join(self.logs)) f.write('\n'.join(self.logs))
self.log(f"日志已保存到: {self.log_file}") print(f"日志已保存到: {self.log_file}")
return True return True
except Exception as e: except Exception as e:
print(f"保存日志失败: {e}") print(f"保存日志失败: {e}")
@@ -879,20 +959,54 @@ class SeatAllocationSystem:
def main(): def main():
"""主函数""" """主函数"""
system = SeatAllocationSystem() print("=" * 60)
print("座位分配系统 v1.0")
print("=" * 60)
try: try:
# 检查数据文件
if not check_data_files():
input("\n按Enter键退出...")
return
print("\n开始运行座位分配系统...")
system = SeatAllocationSystem()
# 运行校验 # 运行校验
if system.run_validation(): if system.run_validation():
# 校验通过,运行分配 # 校验通过,询问是否继续分配
system.run_allocation() response = input("\n文件校验通过,是否开始座位分配? (Y/n): ")
if response.lower() in ['', 'y', 'yes']:
# 运行分配
if system.run_allocation():
print("\n🎉 座位分配完成!")
print("请查看以下输出文件:")
print("- 座位信息_最终分配.xlsx (分配结果)")
print("- 最终座位分配日志.xlsx (详细日志)")
print("- seat_allocation_log.txt (运行日志)")
else:
print("\n❌ 座位分配失败!")
else:
print("用户取消座位分配")
else:
print("\n❌ 文件校验失败,请修复问题后重试")
# 保存日志 # 保存日志
system.logger.save_logs() system.logger.save_logs()
except FileNotFoundError as e:
print(f"\n❌ 文件未找到: {e}")
print("请确保所有必要文件都在程序目录下")
except PermissionError as e:
print(f"\n❌ 文件权限错误: {e}")
print("请确保程序有读写文件的权限")
except Exception as e: except Exception as e:
system.logger.log(f"系统运行出错: {e}") print(f"\n❌ 程序运行出错: {e}")
system.logger.save_logs() print("请检查数据文件格式是否正确")
finally:
# 等待用户确认后退出
input("\n程序结束按Enter键退出...")
if __name__ == "__main__": if __name__ == "__main__":
main() main()

496
windows_build.py Normal file
View File

@@ -0,0 +1,496 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Windows专用构建脚本
自动检测依赖、构建独立exe文件并创建分发包
适用于Windows 7/10/11 (x64)
"""
import os
import sys
import subprocess
import platform
import shutil
import time
from pathlib import Path
class WindowsBuilder:
"""Windows构建器"""
def __init__(self):
self.project_root = Path.cwd()
self.dist_dir = self.project_root / 'dist'
self.build_dir = self.project_root / 'build'
self.package_dir = self.project_root / '座位分配系统_Windows_分发包'
def check_environment(self):
"""检查构建环境"""
print("=" * 60)
print("Windows构建环境检查")
print("=" * 60)
# 检查操作系统
if platform.system() != 'Windows':
print(f"❌ 当前系统: {platform.system()}")
print("此脚本仅适用于Windows系统")
return False
print(f"✅ 操作系统: {platform.system()} {platform.release()}")
print(f"✅ 架构: {platform.machine()}")
print(f"✅ Python版本: {sys.version}")
# 检查主程序文件
main_script = self.project_root / 'seat_allocation_system.py'
if not main_script.exists():
print("❌ 未找到主程序文件: seat_allocation_system.py")
return False
print(f"✅ 主程序文件存在: {main_script}")
return True
def install_dependencies(self):
"""安装构建依赖"""
print("\n" + "=" * 60)
print("安装构建依赖")
print("=" * 60)
required_packages = [
'pandas>=1.3.0',
'openpyxl>=3.0.0',
'numpy>=1.20.0',
'pyinstaller>=4.0'
]
for package in required_packages:
print(f"\n检查 {package}...")
package_name = package.split('>=')[0]
try:
__import__(package_name)
print(f"{package_name} 已安装")
except ImportError:
print(f"📦 安装 {package}...")
try:
cmd = [sys.executable, '-m', 'pip', 'install', package, '--user']
result = subprocess.run(cmd, capture_output=True, text=True,
encoding='utf-8', errors='ignore')
if result.returncode == 0:
print(f"{package} 安装成功")
else:
print(f"{package} 安装失败")
print(f"错误信息: {result.stderr}")
return False
except Exception as e:
print(f"❌ 安装过程出错: {e}")
return False
return True
def clean_build_dirs(self):
"""清理构建目录"""
print("\n清理构建目录...")
for dir_path in [self.dist_dir, self.build_dir]:
if dir_path.exists():
try:
shutil.rmtree(dir_path)
print(f"✅ 清理目录: {dir_path}")
except Exception as e:
print(f"⚠️ 清理目录失败 {dir_path}: {e}")
# 清理spec文件
for spec_file in self.project_root.glob('*.spec'):
try:
spec_file.unlink()
print(f"✅ 清理spec文件: {spec_file}")
except Exception as e:
print(f"⚠️ 清理spec文件失败 {spec_file}: {e}")
def create_spec_file(self):
"""创建PyInstaller配置文件"""
print("\n创建PyInstaller配置文件...")
spec_content = '''# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
a = Analysis(
['seat_allocation_system.py'],
pathex=[],
binaries=[],
datas=[],
hiddenimports=[
'pandas',
'openpyxl',
'numpy',
'xlsxwriter',
'xlrd',
'datetime',
'pathlib',
'openpyxl.workbook',
'openpyxl.worksheet',
'openpyxl.styles'
],
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=[
'matplotlib',
'scipy',
'IPython',
'jupyter',
'notebook',
'tkinter',
'PyQt5',
'PyQt6',
'PySide2',
'PySide6'
],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False,
)
pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)
exe = EXE(
pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
[],
name='座位分配系统',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=False,
upx_exclude=[],
runtime_tmpdir=None,
console=True,
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
)
'''
spec_file = self.project_root / 'seat_allocation.spec'
with open(spec_file, 'w', encoding='utf-8') as f:
f.write(spec_content)
print(f"✅ 配置文件已创建: {spec_file}")
return spec_file
def build_executable(self, spec_file):
"""构建可执行文件"""
print("\n" + "=" * 60)
print("开始构建可执行文件")
print("=" * 60)
cmd = [
sys.executable, '-m', 'PyInstaller',
'--clean',
'--noconfirm',
str(spec_file)
]
print(f"执行命令: {' '.join(cmd)}")
print("这可能需要几分钟时间,请耐心等待...")
start_time = time.time()
try:
# 使用Popen来实时显示输出
process = subprocess.Popen(
cmd,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
universal_newlines=True,
encoding='utf-8',
errors='ignore'
)
# 实时显示输出
for line in process.stdout:
line = line.strip()
if line:
if 'WARNING' in line:
print(f"⚠️ {line}")
elif 'ERROR' in line:
print(f"{line}")
elif 'Building' in line or 'Analyzing' in line:
print(f"🔄 {line}")
elif 'completed successfully' in line:
print(f"{line}")
# 等待进程完成
return_code = process.wait()
build_time = time.time() - start_time
if return_code == 0:
print(f"\n✅ 构建成功! 耗时: {build_time:.1f}")
# 检查生成的文件
exe_path = self.dist_dir / '座位分配系统.exe'
if exe_path.exists():
file_size = exe_path.stat().st_size / (1024 * 1024) # MB
print(f"✅ 生成文件: {exe_path}")
print(f"✅ 文件大小: {file_size:.1f} MB")
return True, exe_path
else:
print("❌ 未找到生成的exe文件")
return False, None
else:
print(f"\n❌ 构建失败! 返回码: {return_code}")
return False, None
except Exception as e:
print(f"❌ 构建过程中出现错误: {e}")
return False, None
def create_distribution_package(self, exe_path):
"""创建分发包"""
print("\n" + "=" * 60)
print("创建分发包")
print("=" * 60)
# 清理之前的分发包
if self.package_dir.exists():
shutil.rmtree(self.package_dir)
self.package_dir.mkdir()
print(f"✅ 创建分发目录: {self.package_dir}")
# 复制可执行文件
dest_exe = self.package_dir / exe_path.name
shutil.copy2(exe_path, dest_exe)
print(f"✅ 复制可执行文件: {exe_path.name}")
# 复制示例文件(如果存在)
example_files = [
('人员信息.xlsx', '人员信息_示例.xlsx'),
('座位信息.xlsx', '座位信息_示例.xlsx')
]
for src_name, dest_name in example_files:
src_path = self.project_root / src_name
if src_path.exists():
dest_path = self.package_dir / dest_name
shutil.copy2(src_path, dest_path)
print(f"✅ 复制示例文件: {dest_name}")
# 创建启动脚本
self.create_startup_script()
# 创建使用说明
self.create_readme()
print(f"\n🎉 分发包创建完成: {self.package_dir}")
return True
def create_startup_script(self):
"""创建启动脚本"""
bat_content = '''@echo off
chcp 65001 >nul
title 座位分配系统
echo ==========================================
echo 座位分配系统 v1.0
echo ==========================================
echo.
:: 检查数据文件
if not exist "人员信息.xlsx" (
echo ❌ 缺少文件: 人员信息.xlsx
echo.
echo 请将 人员信息_示例.xlsx 重命名为 人员信息.xlsx
echo 并按照格式填入您的数据
echo.
pause
exit /b 1
)
if not exist "座位信息.xlsx" (
echo ❌ 缺少文件: 座位信息.xlsx
echo.
echo 请将 座位信息_示例.xlsx 重命名为 座位信息.xlsx
echo 并按照格式填入您的数据
echo.
pause
exit /b 1
)
echo ✅ 数据文件检查通过
echo.
echo 正在启动座位分配系统...
echo.
:: 运行程序
"座位分配系统.exe"
echo.
echo 程序运行完毕
pause
'''
bat_file = self.package_dir / '运行座位分配系统.bat'
with open(bat_file, 'w', encoding='gbk') as f:
f.write(bat_content)
print(f"✅ 创建启动脚本: {bat_file.name}")
def create_readme(self):
"""创建使用说明"""
readme_content = f"""座位分配系统 使用说明
版本: v1.0
构建时间: {time.strftime('%Y-%m-%d %H:%M:%S')}
适用系统: Windows 7/10/11 (64位)
====================
快速开始
====================
1. 准备数据文件
- 将 "人员信息_示例.xlsx" 重命名为 "人员信息.xlsx"
- 将 "座位信息_示例.xlsx" 重命名为 "座位信息.xlsx"
- 按照示例格式填入您的实际数据
2. 运行程序
- 双击 "运行座位分配系统.bat" 启动程序
- 或者直接双击 "座位分配系统.exe"
3. 查看结果
- 座位信息_最终分配.xlsx (最终分配结果)
- 最终座位分配日志.xlsx (详细分配记录)
- seat_allocation_log.txt (运行日志)
====================
数据文件格式要求
====================
人员信息.xlsx 必需列:
- 姓名: 人员姓名
- 证件类型: 身份证/护照等
- 证件号: 证件号码
- 手机号: 联系电话
- 备注: 连坐人数(留空表示单独坐)
座位信息.xlsx 必需列:
- 区域: 座位区域
- 楼层: 楼层信息
- 排号: 排号
- 座位号: 具体座位号
====================
连坐规则说明
====================
1. 单人坐位: 备注列留空
2. 连坐组合: 第一人在备注列填写总人数,其他人备注留空
例如: 张三(备注:3)、李四(备注:空)、王五(备注:空)
表示这3人需要连坐
3. 支持1-10人连坐
4. 系统自动寻找连续座位进行分配
====================
常见问题
====================
Q: 提示缺少依赖包怎么办?
A: 程序会自动尝试安装,如果失败请确保网络连接正常
Q: 提示文件权限错误?
A: 请确保程序有读写当前目录的权限
Q: 无法找到连续座位?
A: 请检查座位信息是否完整,或调整连坐组大小
Q: Excel文件打不开?
A: 请使用Microsoft Excel 2010或更高版本
====================
技术支持
====================
如果遇到问题,请检查以下内容:
1. 数据文件格式是否正确
2. 文件是否存在读写权限
3. 系统是否为Windows 7以上版本
4. 是否有足够的磁盘空间
详细错误信息请查看 seat_allocation_log.txt 文件
"""
readme_file = self.package_dir / '使用说明.txt'
with open(readme_file, 'w', encoding='utf-8') as f:
f.write(readme_content)
print(f"✅ 创建使用说明: {readme_file.name}")
def build(self):
"""执行完整构建流程"""
print("开始Windows构建流程...\n")
# 1. 检查环境
if not self.check_environment():
return False
# 2. 安装依赖
if not self.install_dependencies():
return False
# 3. 清理构建目录
self.clean_build_dirs()
# 4. 创建配置文件
spec_file = self.create_spec_file()
# 5. 构建可执行文件
success, exe_path = self.build_executable(spec_file)
if not success:
return False
# 6. 创建分发包
if not self.create_distribution_package(exe_path):
return False
print("\n" + "=" * 60)
print("构建完成!")
print("=" * 60)
print(f"✅ 分发包位置: {self.package_dir}")
print(f"✅ 可执行文件: {exe_path}")
print("\n使用方法:")
print("1. 将整个分发包复制到目标电脑")
print("2. 准备好人员信息.xlsx和座位信息.xlsx文件")
print("3. 双击运行 '运行座位分配系统.bat'")
return True
def main():
"""主函数"""
builder = WindowsBuilder()
try:
success = builder.build()
if success:
print("\n🎉 构建成功!")
else:
print("\n❌ 构建失败!")
except KeyboardInterrupt:
print("\n\n用户中断构建过程")
except Exception as e:
print(f"\n❌ 构建过程中出现未知错误: {e}")
finally:
input("\n按Enter键退出...")
if __name__ == "__main__":
main()