作品展示:
背景需求:
因为户外游戏的安排变化了,从一周5个场地相同改为一周5个场地不同
所以“自主游戏观察记录表”的内容也要修改。
原来“中2班”每周两次记录都是同一个场地内容
现在“中2班”每周两个记录内容不同
使用原来的代码做一个微调
素材准备:
EXCLE模板
word模板
因为数据源是XLS,所以要先转成xlsx,
这个表里面有多张工作表,所以要遍历每张表
读取XLSX第2-20行的数据,写入新建的“数据xlsx”
教师名字做个列表,每份docx的教师名字都不同
读取“数据.xlsx"的数据,生成doc模板
全部代码:
# -*- coding:utf-8 -*- 1
'''
每周5天场地不同,自主游戏观察记录模板-中2到中7,新建EXCL“数据表”
作者:阿夏
时间:2024年3月10日
'''
# 一、导入相关模块,设定excel所在文件夹和生成word保存的文件夹
from docxtpl import DocxTemplate
from openpyxl import Workbook
import pandas as pd
import os
import time
import openpyxl
# 定义基本路径
path = r'C:\Users\jg2yXRZ\OneDrive\桌面\周计划\02自主游戏观察记录模板制作'
# 原始xls文件路径和新xlsx文件路径
xls_file = path + r'\20240310 (有场地)中班新版户外游戏(班主任用).xls'
old_path = path + r'\20240310 (有场地)中班新版户外游戏(班主任用).xlsx'
new_path = path + r'\数据.xlsx'
Teather=['张二老师','李二老师','赵三老师','王三老师','冯四老师','朱四老师','谢五老师','夏五老师','戴六老师','蔡六老师','陈七老师','王七老师']
print('----------第0步:xls转xlsx----')
# 读取xls文件
xls_path = os.path.join(path, xls_file)
xls = pd.ExcelFile(xls_path)
# 创建一个新的ExcelWriter对象
xlsx_path = os.path.join(path, old_path)
writer = pd.ExcelWriter(xlsx_path, engine='xlsxwriter')
# 遍历xls文件中的每张表
for sheet_name in xls.sheet_names:
# 读取每张表的数据
df = pd.read_excel(xls, sheet_name)
# 将每张表的数据写入新的ExcelWriter对象
df.to_excel(writer, sheet_name=sheet_name, index=False)
# 保存ExcelWriter对象中的数据到xlsx文件
writer.save()
print('----------第1步:读取班级标签,读取指定内容,写入EXCEL----')
from openpyxl import load_workbook
title=[]
for x in range(2,8):
title .append('中{}班户外游戏'.format(x))
# 创建一个新的Excel工作簿
wb = Workbook()
# 保存新的Excel工作簿
wb.save(new_path)
for y in range(len(title)):
# 打开1.xlsx文件
wb1 = load_workbook(old_path)
# 选择'Sheet2'标签
# sheet1 = wb1['中2班户外游戏']
sheet1 = wb1['{}'.format(title[y])]
# 创建一个新的工作簿2.xlsx
wb2 = load_workbook(new_path)
# 选择默认的活动工作表
sheet2 = wb2.active
# 表头内容列表
header = ['week', 'grade', 'number', 'T1', 'T2', 'content1', 'content2']
# 写入表头内容
for i in range(len(header)):
sheet2.cell(row=1, column=i+1, value=header[i])
# 读取行数
import pandas as pd
# 读取Excel文件
xls = pd.ExcelFile(old_path)
# 选择第2张表的名称
sheet_name = xls.sheet_names[1] # 第2张表在索引1位置
# 读取第2张表
df = pd.read_excel(xls, sheet_name)
# 获取第2张表的行数
num_rows = df.shape[0]
print(f"第2张表总共有 {num_rows} 行数据。")
# 读取第A1:A13的内容,并保存到B1:B13
for i in range(2, 21): # 这里是新表写入的位置
# 提取周次
v0=i-1 # 从1到19
sheet2.cell(row=i, column=1).value = v0
print(v0)
# 提取每周的周一和周二的户外场地内容
for x in range(3,5): # 读取3和4两列
value = sheet1.cell(row=i, column=x).value # C列=3 第三行
print(value)
sheet2.cell(row=i, column=x+3).value = value # 第二张的F列2行 在第6-7列插入
# 提取年级、班级
value = sheet1.cell(row=i, column=1).value # A列=3 中2班
v1=value[:1] # 只要“中"
v2=value[1:2] # 只要“4"
sheet2.cell(row=i, column=2).value = v1
sheet2.cell(row=i, column=3).value = v2
# 提取教师,分别写入教师名字
T=Teather[y*2:y*2+2]
for t in range(len(T)):
sheet2.cell(row=i, column=t+4).value = T[t]
# 保存修改后的2.xlsx文件
wb2.save(new_path)
print('----------第2步:制作路径----')
zpath=os.getcwd()+'\\'
zpath=r'C:\Users\jg2yXRZ\OneDrive\桌面\周计划\02自主游戏观察记录模板制作'+'\\'
file_path=zpath+'零时\\'
# print(file_path)
# r'\零时Word'
print('----------第3步:遍历excel,逐个生成word(form.docx是前面的模板)------------')
try:
os.mkdir(file_path)
except:
pass
# tpl = DocxTemplate(zpath+'自主游戏观察记录模板.docx')
IDcard = pd.read_excel(zpath+'数据.xlsx')
week=IDcard["week"]
grade = IDcard["grade"]
number=IDcard["number"]
# str.rstrip()
T1=IDcard["T1"] # str.rstrip()用于去掉换行符
T2=IDcard["T2"] # str.rstrip()用于去掉换行符
content1=IDcard["content1"] # str.rstrip()用于去掉换行符
content2=IDcard["content2"] # str.rstrip()用于去掉换行符
# 遍历excel行,逐个生成
num = IDcard.shape[0]
for i in range(num):
context = {
"week": week[i],
"grade": grade[i],
"number": number[i],
"T1": T1[i],
"T2": T2[i],
"content1": content1[i],
"content2": content2[i],
}
tpl = DocxTemplate(zpath+'自主游戏观察记录模板.docx')
tpl.render(context)
# tpl.save(file_path+r"\{} 的身份证.docx".format(name[i]))
#
tpl.save(file_path+"合并{}.docx".format('%02d'%week[i]))
print('----------第4步:doc 文档合并------------')
# 合并所有Word
import win32com.client as win32
import os
word = win32.gencache.EnsureDispatch('Word.Application')
#启动word对象应用
word.Visible = False
files = []
for filename in os.listdir(file_path):
filename = os.path.join(file_path,filename)
files.append(filename)
#新建合并后的文档(使用模板,进行12个文件夹的合并,把12个文件夹的内容贴到已有的模板(包含0.7边、四分栏))
output = word.Documents.Add()
for file in files:
output.Application.Selection.InsertFile(file)#拼接文档
#获取合并后文档的内容
doc = output.Range(output.Content.Start, output.Content.End)
# 合并word
lspathall=zpath+'{}({})班自主游戏观察记录(202402-202406).docx'.format(grade[i],number[i])
output.SaveAs(lspathall) #保存
output.Close()
print('----------第4步:删除临时文件夹------------')
import shutil
shutil.rmtree(file_path) #递归删除文件夹,即:删除非空文件夹