
背景需求
本学期的课题有4个大课题,3个小课题通过,需要做阶段资料。

一、初步设计
我很早以前就做好了Python代码(只有上学期),批量制作每个课题的阶段资料模版。因为小课题的编号没有出来,就一直没有发给课题负责人。




# 一、导入相关模块,设定excel所在文件夹和生成word保存的文件夹
from docxtpl import DocxTemplate
import pandas as pd
import os
print('----1、第一次新WORD制作--------')
# path = r"D:\test\02办公类\91周计划4份_20240901中2班\04 周计划7天"
path= r'C:\Users\jg2yXRZ\OneDrive\桌面\2024111上下学期课题模版批量\01模版'
print(path)
folder_path=path+r'\01上学期(docx)'
# 替换为你的文件夹路径
docx_files = []
for root, dirs, files in os.walk(folder_path):
for file in files:
if file.endswith('.docx'):
file_path = os.path.join(root, file)
docx_files.append((file, file_path))
for file_name, file_path in docx_files:
print(f"docx文件名 {file_name}")
print(f"docx路径名: {file_path}")
import xlrd
# 假设 path 是之前已经定义好的文件路径变量的一部分
file_paths = path + r'\总课题信息统计表.xlsx'
workbook = xlrd.open_workbook(file_paths)
sheet = workbook.sheet_by_index(0) # 获取第一张工作表
# 遍历每一行,从第二行开始(索引为1,因为索引从0开始,但Excel从1开始计数行)
for row_idx in range(1,sheet.nrows): # sheet.nrows 返回工作表中的行数
# 读取当前行的E到K列(列索引从0开始,但Excel列从1开始计数,所以E=4, ..., K=10)
row_data = sheet.row_values(row_idx, start_colx=4, end_colx=11)
# print(row_data)
# 删除 row_data 中的空元素(None 或空字符串)
days = [cell for cell in row_data if cell is not None and cell != '']
# 统计每行非空元素的数量 (天数)
item = len(days)
print(f'第{row_idx}行,本周天数是{item}天')
# 如果是5天就用5天模版,如果是7天,就用7天模版
# doc_path=path+r'\01上学期(docx)'
tpl = DocxTemplate(folder_path+fr'\{file_name}')
WeeklyPlan = pd.read_excel(path+r'\总课题信息统计表.xlsx')
# 没有str.rstrip()是数字格式
# str.rstrip()都是文字格式
num = WeeklyPlan["num"]
title = WeeklyPlan["title"].str.rstrip()
name =WeeklyPlan["name"].str.rstrip()
member =WeeklyPlan["member"].str.rstrip()
item=WeeklyPlan["item"].str.rstrip()
number =WeeklyPlan["number"].str.rstrip()
group =WeeklyPlan["group"].str.rstrip()
master = WeeklyPlan["master"].str.rstrip()
year1 = WeeklyPlan["year1"]
month1= WeeklyPlan["month1"]
year2= WeeklyPlan["year2"]
month2= WeeklyPlan["month2"]
first = WeeklyPlan["first"]
second = WeeklyPlan["second"]
third = WeeklyPlan["third"]
d11 = WeeklyPlan["d11"]
d12 = WeeklyPlan["d12"]
d21 = WeeklyPlan["d21"]
d22 = WeeklyPlan["d22"]
d31 = WeeklyPlan["d31"]
d32 = WeeklyPlan["d32"]
start = WeeklyPlan["start"]
end = WeeklyPlan["end"]
# 遍历excel行,逐个生成
# num = WeeklyPlan.shape[0]
# print(num)
for i in range(row_idx-1,row_idx):
context = {
"num": num[i],
"title": title[i],
"name": name[i],
"member": member[i],
"item": item[i],
"number": number[i],
"group": group[i],
"master": master[i],
"year1": year1[i],
"month1": month1[i],
"year2": year2[i],
"month2": month2[i],
"first": first[i],
"second": second[i],
"third": third[i],
"d11": d11[i],
"d12": d12[i],
"d21": d21[i],
"d22": d22[i],
"d31": d31[i],
"d32": d32[i],
"num": num[i],
"start": start[i],
"end": end[i],
}
tpl.render(context)
# 假设 weekshu[i] 是类似于 '4、5' 或 '7' 这样的字符串
# 姓名+课题阶段资料\01上学期\
# name[i]_item[i]阶段资料\01上学期
if len(item[i])==4:
# 无文件夹
docx_path=path+fr'\10批量打包\{num[i]:02}{name[i]}_{item[i]}课题阶段资料\01上学期'
# 有文件夹(只要生成前两个)空文件夹,去掉最后的.docx
docx_path=path+fr'\10批量打包\{num[i]:02}{name[i]}_{item[i]}课题阶段资料\01上学期\{name[i]} {file_name[:-5]}'
os.makedirs(docx_path,exist_ok=True)
else:
# 无文件夹
docx_path=path+fr'\10批量打包\{num[i]:02}{name[i]}_{item[i]}阶段资料\01上学期'
# 有文件夹(只要生成前两个)空文件夹,去掉最后的.docx
docx_path=path+fr'\10批量打包\{num[i]:02}{name[i]}_{item[i]}阶段资料\01上学期\{name[i]} {file_name[:-5]}'
os.makedirs(docx_path,exist_ok=True)
tpl.save(docx_path+fr"\{name[i]} {file_name}")



以上代码只做了上学期的模版,包含两种样式(在文件夹里有DOCX,和所有DOCX在一起)
二、代码改良
一直拖到1月份,才知道小课题没有编号了。当时上半学期资料已经提交了,我在批注时发现负责人们使用的模版不一样
由于没有序号标注,文件首字不同导致文本排序没有按照目录,一部分批注时间就用来提示基础信息的填写。





每个人的阶段内容相同但是排序不同,所以我还是想把每一份文件DOCX的序号统一。

所以我再次修改了一下代码,把上下学期的模版都做好了。
课题成员基本