当前位置: 首页 > news >正文

【办公类-99-01】20250103用“课题阶段资料模版“批量制作“7个课题档案袋“

背景需求

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

一、初步设计

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

# 一、导入相关模块,设定excel所在文件夹和生成word保存的文件夹
from docxtpl import DocxTemplate
import pandas as pd
import osprint('----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上学期'# 有文件夹(只要生成前两个)空文件夹,去掉最后的.docxdocx_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上学期'# 有文件夹(只要生成前两个)空文件夹,去掉最后的.docxdocx_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的序号统一。

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

课题成员基本信息

上半学期日期

下半学期日期

代码展示


'''
根据课题组成员名单制作课题阶段资料(上下学期)的个人模版(包含个人的课题信息)
星火讯飞、阿夏
2025年1月3日
'''# 一、导入相关模块,设定excel所在文件夹和生成word保存的文件夹
from docxtpl import DocxTemplate
import pandas as pd
import os
import xlrdprint('----1、第一次新WORD制作--------')
# path = r"D:\test\02办公类\91周计划4份_20240901中2班\04 周计划7天"
path = r'C:\Users\jg2yXRZ\OneDrive\桌面\2024111上下学期课题模版批量\01模版'
print(path)day=['上','下']for x in day:folder_path = path + fr'\01{x}学期(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}")# 假设 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天模版tpl = DocxTemplate(folder_path + fr'\{file_name}')WeeklyPlan = pd.read_excel(path + r'\总课题信息统计表.xlsx')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"]month3 = WeeklyPlan["month3"]month4 = WeeklyPlan["month4"]forth = WeeklyPlan["forth"]fifth = WeeklyPlan["fifth"]sixth = WeeklyPlan["sixth"]d11 = WeeklyPlan["d11"]d12 = WeeklyPlan["d12"]d21 = WeeklyPlan["d21"]d22 = WeeklyPlan["d22"]d31 = WeeklyPlan["d31"]d32 = WeeklyPlan["d32"]d41 = WeeklyPlan["d41"]d42 = WeeklyPlan["d42"]d51 = WeeklyPlan["d51"]d52 = WeeklyPlan["d52"]d61 = WeeklyPlan["d61"]d62 = WeeklyPlan["d62"]start = WeeklyPlan["start"]end = WeeklyPlan["end"]# 遍历excel行,逐个生成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],"start": start[i],"end": end[i],"month3": month3[i],"month4": month4[i],"forth": forth[i],"fifth": fifth[i],"sixth": sixth[i],"d41": d41[i],"d42": d42[i],"d51": d51[i],"d52": d52[i],"d61": d61[i],"d62": d62[i],}tpl.render(context)if len(item[i])==4:  # 区级一般#(构建3级文件夹) docx_path=path+fr'\10批量打包\{num[i]:02}{name[i]}_{item[i]}_课题阶段资料\01{x}学期\{name[i]} {file_name[:-5]}'print(docx_path)os.makedirs(docx_path,exist_ok=True) tpl.save(docx_path+fr"\{name[i]} {file_name}")# 存在二级文件夹下,都是DOCX(便于打印)docx_path1=path+fr'\10批量打包\{num[i]:02}{name[i]}_{item[i]}_课题阶段资料\01{x}学期'tpl.save(docx_path1+fr"\{name[i]} {file_name}")else:# 区级小课题 #    #(构建3级文件夹)                    docx_path=path+fr'\10批量打包\{num[i]:02}{name[i]}_{item[i]}_课题阶段资料\01{x}学期\{name[i]} {file_name[:-5]}'print(docx_path)# 小课题的上学期没有“开题报告”,    if file_name=='03开题报告(例举).docx':pass# 小课题的下学期没有“中期报告”,  elif file_name=='01中期报告(举例).docx':passelse:os.makedirs(docx_path,exist_ok=True)                        tpl.save(docx_path+fr"\{name[i]} {file_name}")#  # 存在二级文件夹下,都是DOCX(便于打印)docx_path1=path+fr'\10批量打包\{num[i]:02}{name[i]}_{item[i]}_课题阶段资料\01{x}学期' tpl.save(docx_path1+fr"\{name[i]} {file_name}")

运行过程

此代码对区级一般课题小课题进行分类,如果是小课题就不用复制“开题报告”和“中期报告”(跳过)

区级一般课题

区级小课题

初步实现了批量模版,为每位老师制作属于自己的课题档案袋(基础信息 课题名称、编号、负责人名字、级别、时间、参与者都有了)

三、后续思考

但是在群发之前还有很多的问题:

1、上学期的01是申请书,如何把下载的申请书自动读入所属文件夹并自动改名

目前这里只有空模版,申请书是之前写的。可以在科研网站上下载下来。尝试复制进去。

2、上学期02是立项书,如何把下载证书图片复制到DOCX内

3、如何进一步调整给每个表格样式(行最小值、跨行)

目前表格本身还是有很多的样式错误,如跨页断行,第一页留出很多空白;需要标题永远再首行

4、如何对标题、表格、书写内容分别确定独立的“样式”

(感谢大头先生的WPS课程,让我发现如何调整这些样式参数)

感慨:

在群发共享之前,还有很多的测试之路啊。

http://www.lryc.cn/news/520402.html

相关文章:

  • Objective-C语言的面向对象编程
  • 有限元分析学习——Anasys Workbanch第一阶段笔记(11)横梁中点挠度仿真结果与计算结果对比
  • GO语言实现KMP算法
  • 【2024年华为OD机试】(A卷,100分)- 打印机队列(Java JS PythonC/C++)
  • SQL语言的面向对象编程
  • android分区和root
  • WebScoket-服务器客户端双向通信
  • 如何在QT中保证线程是安全的?
  • Lock接口
  • 02——变量
  • MonacoEditor在vue3 element-plus的tabs非默认激活标签页中无法正常显示的问题
  • 【RedisStack】Linux安装指南
  • 说一说mongodb组合索引的匹配规则
  • Maven核心插件之maven-resources-plugin
  • C++ 鼠标轨迹算法 - 防止游戏检测
  • 网络学习记录6
  • 【数学】概率论与数理统计(四)
  • 小结:华为交换机常用的操作指令
  • 轻松学51单片机--基于普中科技开发板练习蓝桥杯及机器人大赛等(8-DS1302实时时钟)
  • 《Java核心技术II》并行流
  • Vue 3前端与Python(Django)后端接口简单示例
  • 《拉依达的嵌入式\驱动面试宝典》—操作系统篇(二)
  • STM32和国民技术(N32)单片机串口中断接收数据及数据解析
  • 【人工智能】大语言模型的微调:让模型更贴近你的业务需求
  • 大语言模型的稀疏性:提升效率与性能的新方向
  • Linux Bridge与Open vSwitch的工作原理及协作
  • async++源码阅读——task模块
  • 项目开发实践——基于SpringBoot+Vue3实现的在线考试系统(五)
  • EF Core一对一和多对多
  • 记一次sealos部署k8s集群之delete了第一台master如何恢复