示例:给小组分班,每班人员有限制,小组不能拆分,小组是合并单元格格式
XLSX 读取数据量大时会卡,最简单的方法是XLSX转成XLS后读取,保存可用使用XLSX模块
# -*- coding: utf8 -*-
## 示例:给小组分班,每班人员有限制,小组不能拆分,小组是合并单元格格式
## XLSX 读取数据量大时会卡,最简单的方法是XLSX转成XLS后读取,保存可用使用XLSX模块
import xlrd # Excel 读取模块
from openpyxl import Workbook # XLSX 写模块
from openpyxl.styles import Alignment # XLSX 格式
def SAVE_XLSX(LL, NAME, L_标题行):
wb = Workbook()
# 获得激活的worksheet,默认有一张名为Sheet的工作表
ws = wb.active
ws.title=NAME # 修改激活的worksheet工作表名称
for 标题行 in L_标题行:
ws.append(标题行)
for XLSX_列号 in ['A','B']:
列合并 = f'{XLSX_列号}1:{XLSX_列号}2'
#print("列合并", 列合并)
ws.merge_cells(列合并) # 合并单元格A1:A2
行合并 = 'C1:D1'
ws.merge_cells(行合并) # 合并单元格C1:D1
ws['C1'].alignment = Alignment(horizontal='center', vertical='center')
XLSX_行号 = len(L_标题行) + 1
for L in LL:
if L != []:
for i in L:
ws.append(i) # 写入1行内容
for XLSX_列号 in ['A','B']:
列合并 = f'{XLSX_列号}{XLSX_行号}:{XLSX_列号}{XLSX_行号+len(L)-1}'
#print("列合并", 列合并)
ws.merge_cells(列合并) # 合并单元格
ws[f"{XLSX_列号}{XLSX_行号}"].alignment = Alignment(horizontal='center', vertical='center') # 居中
XLSX_行号 += len(L)
# 保存文件
FILE_NAME = f"{NAME}.xlsx"
wb.save(FILE_NAME)
print(f"{FILE_NAME} 保存完成")
标题行数 = 2
文件 = '未分班.xls'
XLS = xlrd.open_workbook(filename=文件) # 打开文件
表格名称列表 = XLS.sheet_names() # ['Sheet1', 'Sheet2']
print(f"表格名称列表:{表格名称列表}")
工作表名 = '全员'
工作表 = XLS.sheet_by_name(工作表名) # 通过名字获取表格
行数 = 工作表.nrows
列数 = 工作表.ncols
工作表名 = 工作表.name
print(f"工作表名:{工作表名} 行数={行数} 列数={列数}")
L_小组 = [] # 以小组为整体加入列表
小组 = [] # 识别出小组成员,组成小组
## 遍历标题行
L_标题行 = []
for 行号 in range(0, 标题行数):
L_DATA_ROW = 工作表.row_values(行号)
L_标题行.append(L_DATA_ROW)
print(f"行号={行号} 内容={L_DATA_ROW}")
## 遍历数据行
for 行号 in range(标题行数, 行数):
L_DATA_ROW = 工作表.row_values(行号)
#print(f"行号={行号} 内容={L_DATA_ROW}")
if L_DATA_ROW[0] == '': # 合并单元格,只要首行有内容,其他行无内容
## 本行是组员
小组.append(L_DATA_ROW) # 组员加入上个小组
else:
## 本行是小组的第一个组员
if 小组 != []:
L_小组.append(小组) # 把上组作为一个整体加入小组列表
#小组 = [] # 重置小组为空
#小组.append(L_DATA_ROW) # 第一个组员加入当前小组
小组 = [L_DATA_ROW] # 重置小组内容,并放入小组第一个组员
if 小组 != []:
L_小组.append(小组) # 最后一个小组加入小组列表
#for 小组 in L_小组:
# print(f"小组成员数量={len(小组)} 成员={小组}")
## 分班 每班15人左右,小组成员不分割
班级编号 = 0
分班 = []
人数上限 = 15 # 分班最后1组全部加入后大于这个数字则本组为本班最后一组人员
分班人数 = 0
for 小组 in L_小组:
小组人数 = len(小组)
#print(f"小组人数={小组人数} 成员={小组}")
分班.append(小组)
分班人数 += 小组人数
if 分班人数 > 人数上限:
班级编号 += 1
print(f"班级编号={班级编号} 分班完成,分班人数={分班人数} 小组数量={len(分班)}")
SAVE_XLSX(分班, f"分班_班级编号_{班级编号}", L_标题行)
分班 = []
分班人数 = 0
if 分班 != []:
班级编号 += 1
print(f"最后剩余组合并为一个班")
print(f"班级编号={班级编号} 分班完成,分班人数={分班人数} 小组数量={len(分班)}")
SAVE_XLSX(分班, f"分班_班级编号_{班级编号}", L_标题行)