【无标题】openpyxl按列拆分Excel文件

现有如下选课学生名单

问题:将学生名单按“学生班级“列拆分为不同的Excel文件,并保保其格式,即类似如下的格式

附源码:

运行环境:Python 3.12 + openpyxl 3.1.2 + windows 11 专业版 21H2,

import os.path
from openpyxl import Workbook, load_workbook
from copy import copy
wb_ori = load_workbook("选课学生名单.xlsx")
ws_ori = wb_ori["Sheet1"]
# 设置单元格格式
def setStyle(ori_cell, dist_cell):
    if ori_cell.has_style:
        dist_cell.font = copy(ori_cell.font)
        dist_cell.border = copy(ori_cell.border)
        dist_cell.border = copy(ori_cell.border)
        dist_cell.fill = copy(ori_cell.fill)
        dist_cell.number_format = copy(ori_cell.number_format)
        dist_cell.alignment = copy(ori_cell.alignment)

# 有效数据从第3行开始,第1行为表格标题,第2行为表头(即每列放什么内容)
# 下一行的range从3开始,以第5列的信息作为单独保存文件的名字(分组)
for i in range(3, ws_ori.max_row + 1):
    filename_dist = "d:/tmp/拆分的文件/" + ws_ori.cell(i, 5).value + ".xlsx"
    if os.path.isfile(filename_dist):
        wb_dist = load_workbook(filename_dist)
        ws_dist = wb_dist.worksheets[0]
    else:
        # 如果是新建文件,则把第1行和第2行都设置成想要的样式,包括列宽
        # 以及第1行的单独格合并
        wb_dist = Workbook()
        ws_dist = wb_dist.worksheets[0]
        ws_dist.cell(1,1).value = ws_ori.cell(1,1).value
        # 合并第1行中的单元格
        ws_dist.merge_cells(range_string='A1:E1')
        setStyle(ws_ori.cell(1, 1), ws_dist.cell(1, 1))
        ws_dist.row_dimensions[1].height = ws_ori.row_dimensions[1].height
        # 设置第2行
        for cl in range(1, ws_ori.max_column + 1):
            ws_dist.cell(2, cl).value = ws_ori.cell(2, cl).value
            ws_dist.column_dimensions[chr(65 + cl - 1)].width = ws_ori.column_dimensions[chr(65 + cl - 1)].width
            setStyle(ws_ori.cell(2, cl), ws_dist.cell(2, cl))
        ws_dist.row_dimensions[2].height = ws_ori.row_dimensions[2].height

    # 获取已经存放了数据的行号
    maxrow1 = ws_dist.max_row
    id = maxrow1 - 1

    # 逐一把当前列的数据填写到目标文件中
    for cl in range(1, ws_ori.max_column + 1):
        ws_dist.cell(maxrow1 + 1, cl).value = ws_ori.cell(i, cl).value
        setStyle(ws_ori.cell(i, cl), ws_dist.cell(maxrow1 + 1, cl))
    ws_dist.row_dimensions[maxrow1 + 1].height = ws_ori.row_dimensions[i].height
    ws_dist.cell(maxrow1 + 1, 1).value = id
    wb_dist.save(filename_dist)
    wb_dist.close()
    print(ws_ori.cell(i, 5).value)

wb_ori.close()

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值