【办公类-54-02】20240827营养员《每周人数统计表》(双休国定假涂成灰色)

背景需求:

学校食堂的营养员发消息,让我再做一份“总园的每周人数统计”

这是我去年2023年9月份做的,用word制作一页模版,营养员批量打印N张,用了2个学期。

用途就是每个班级来园人数写在空格里,便于营养员统计当天要陪多少菜,每个班级根据人数,称重相应量的饭菜汤。

但是时间久远,原来的word模板模版我早就找不到了。

加上Python技术的深入,我觉得这种需要手动写周次、日期的表格,不规范,也容易填错位置。

我想直接把“周次”“日期”,甚至是每周的“实际工作日”都标出来,进一步方便营养员只填写数字。

前期正好做了一套日历提取

【办公类-53-02】2024年第一学期校历制作(“年月日去0”版、周计划短日期、教案长日期)_word制作校历-CSDN博客文章浏览阅读499次,点赞14次,收藏7次。【办公类-53-02】2024年第一学期校历制作(“年月日去0”版、周计划短日期、教案长日期)_word制作校历https://blog.csdn.net/reasonsummer/article/details/140822416

首先制作一个excle模版

页边距

页眉

不能有表格合并,否则批量后会报错,表格样式变化等情况

代码展示:

'''
营养员的每周人数统计表(20周日期、周次、双休国定假日的表格为灰色)
星火讯飞,阿夏
2024年8月27日
'''


import pandas as pd
import openpyxl
from openpyxl import load_workbook
import copy


print('------------1、读取表格里整理好的周日、日期,列表形式')
path=r'C:\Users\jg2yXRZ\OneDrive\桌面\营养员表格'
# 打开日期工作表
df = pd.read_excel(path+r'\2024学年第一学期校历(最终修改).xlsx')
# 读取周次和日期
col1 = df.iloc[:, 0].tolist()  # 周次,第01周
col2 = df.iloc[:, 2].tolist()  # 日期:2024年9月1日-2024年9月7日

print(col1)
print(col2)

print('2--------- 在同一个工作簿内复制N个周次的工作表')
# 打开模版
wb = load_workbook(path+r'\20240901总园每周人数统计.xlsx')
ws = wb.active

for i in range(len(col1)):
    title = f'总园 每周人数统计 第 {int(col1[i][1:3])} 周 ({col2[i]})'
    # print(title)
    # 写入标题  
    ws['A1'] = title
    # 创造新的标签名
    new_ws = wb.create_sheet(title=col1[i])


    # 复制模版,变成新的工作表
    for row in ws.iter_rows():
        for cell in row:
            new_cell = new_ws[cell.coordinate]
            new_cell.value = cell.value
            if cell.has_style:
                new_cell.font = copy.copy(cell.font)
                new_cell.border = copy.copy(cell.border)
                new_cell.fill = copy.copy(cell.fill)
                new_cell.number_format = copy.copy(cell.number_format)
                new_cell.protection = copy.copy(cell.protection)
                new_cell.alignment = copy.copy(cell.alignment)
        #    单元格高度
            new_ws.row_dimensions[cell.row].height = ws.row_dimensions[cell.row].height
        #  单元格宽度
            new_ws.column_dimensions[openpyxl.utils.get_column_letter(cell.column)].width = ws.column_dimensions[openpyxl.utils.get_column_letter(cell.column)].width

#    页边距
    new_ws.page_margins = copy.copy(ws.page_margins)
        # new_ws.header = copy.copy(ws.header)
        # new_ws.footer = copy.copy(ws.footer)
    
    
   
#    合并第一行
    for sheet in wb:
        # �ϲ�A1��H1��Ԫ��
        sheet.merge_cells('A1:H1')   # �ϲ���Ԫ��

# 删除一个工作表
first_sheet_name = wb.sheetnames[0]
del wb[first_sheet_name]

# 保存新表
wb.save(path+r'\20240901总园每周人数统计2.xlsx')


print('----------3、将周末假日的格子变成灰色') 
import pandas as pd
from openpyxl import load_workbook
from openpyxl.styles import PatternFill
import itertools

# 读取Excel文件
file_path = path+r'\20240901总园每周人数统计2.xlsx'
xls = pd.ExcelFile(file_path)

# 获取所有工作表名称
sheet_names = xls.sheet_names

# 加载工作簿
workbook = load_workbook(file_path)

# 遍历工作表
for index, sheet_name in enumerate(sheet_names):
    # 如果是第1、6、18张表格,跳过,其他表表都是周日周末灰色
    if index + 1 in [2,3,4,5,6, 18]:
        continue    
    # 获取工作表对象
    sheet = workbook[sheet_name]

    # 定义浅灰色填充样式
    light_gray_fill = PatternFill(start_color='D3D3D3', end_color='D3D3D3', fill_type='solid')

    # 填充指定单元格   
    for row in itertools.chain(range(9, 11), range(19, 21)):
        for col in range(1, 9):
            cell = sheet.cell(row=row, column=col)
            cell.fill = light_gray_fill

    # 第2周 周六上班,周日休息

# 遍历工作表
for index, sheet_name in enumerate(sheet_names):
    # 工作表的索引位置 第2周、第3周、第18周
    b=[2,3,4,5,6,18]

    # 周一到周日那一天休息,就用相应的坐标    
    # 周一=04,14
    # 周二=05,15
    # 周三=06,16
    # 周四=07,17
    # 周五=08,18
    # 周六=09,10
    # 周日=10,20
    
    c=[7,1267,6,234567,17,367] # 第2周的第7天休息、第3周1267天都休息、第18周的367天都休息
    w=[4,5,6,7,8,9,10]
    
    # 只选休息
    # 第2周 周日休息
    # 第3周 周一二休息写入中秋,周六周日休息
    # 第4周 周六休息,周日上班
    # 第5周 周一上班,周二到周日休息,同时写入国庆
    # 第6周 周一休息、周六上班,周日休息
    # 第18周 周三休息、周六周日上班

    for d in range(len(b)):        
        if index + 1 in [b[d]]:
                # 获取工作表对象
            sheet = workbook[sheet_name]

            # 定义浅灰色填充样式
            light_gray_fill = PatternFill(start_color='D3D3D3', end_color='D3D3D3', fill_type='solid')

            # 休息日
            t=str(c[d])
            print(t)
            # 读取每一个第几天
            for tt in t:
                p=int(tt)
                q1=int(w[p-1])
                q2=q1+10
                # 填充指定单元格   (如果是周日,就是10,11  20,21
                # print(f'shuzi{w[p-1]}')
                # print(f'shuzi{w[p-1]}+1')
                for row in itertools.chain(range(q1,q1+1), range(q2, q2+1)):
                    for col in range(1, 9):
                        cell = sheet.cell(row=row, column=col)
                        cell.fill = light_gray_fill

# 保存修改后的Excel文件
workbook.save(file_path)

print('----------4、打开excle另存为PDF(选中所有工作簿,)便于打印') 

代码一共有4步:

1、读取已经制作好的周次和日期(7天全部日期,收尾相连)

2、复制EXCLE模版(包括原来的格式),变成新的工作表和标题

模版没有合并单元格,但是为了标题居中显示,在代码里面合并了第一行的单元格

第3步:对双休日、国定假、调换班进行灰色设置

1.首先查看日历,可以发现大部分周次都是正常的安排(周1-5上班,周67日休息),只有个别的2-6周、18周的工作日比较乱,

跳过特殊的周次,其他周次都是周六周日休息

模版显示,周六的X坐标是9,19,周日的X坐标是10,20

由此,传统的双休日上都被打上灰色,显示不用填写

但是一些特殊周次,需要分析一周七天,到底那几天休息,需要打码灰色

说明:原则上每周第一天从周日开始,但实际我们习惯于从周一开始,周日结束,所以第2周是从黄色9日开始到白色15日结束(15日写在第3周)

第18周是从浅蓝色30日开始到粉色5日结束(5日第19周)

最后结果就是,第2周一天休息,是数字7(周日),第3周有4天休息(周1、周2、周6、周7)以此类推,第5周是国庆节,所以周2、3、4、5、6、7都休息)

前文提到,周六的X在9,19,周日的X在10和20,依次类推一下,周1的X就是4和14,周三的X就是6和16

用便利方法,给特殊的周,涂上灰色

全部完成后打开EXCEL,另存为PDF,一定要选“整个工作簿”再保存。

保存后直接打开PDF,页眉无法保存

PDF样式被固定了,便于批量打印

结余:

今天收到人事通知,我成为中2班的班主任,可以用这个涂灰色的方法,做班级的点名册。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿夏reasonsummer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值