大数量的Excel文件拆分示例

示例:给小组分班,每班人员有限制,小组不能拆分,小组是合并单元格格式

 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_标题行)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值