背景需求:
学校食堂的营养员发消息,让我再做一份“总园的每周人数统计”
这是我去年2023年9月份做的,用word制作一页模版,营养员批量打印N张,用了2个学期。
用途就是每个班级来园人数写在空格里,便于营养员统计当天要陪多少菜,每个班级根据人数,称重相应量的饭菜汤。
但是时间久远,原来的word模板模版我早就找不到了。
加上Python技术的深入,我觉得这种需要手动写周次、日期的表格,不规范,也容易填错位置。
我想直接把“周次”“日期”,甚至是每周的“实际工作日”都标出来,进一步方便营养员只填写数字。
前期正好做了一套日历提取
首先制作一个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(选中所有工作簿,)便于打印')