【办公类-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课程,让我发现如何调整这些样式参数)
感慨:
在群发共享之前,还有很多的测试之路啊。
相关文章:

【办公类-99-01】20250103用“课题阶段资料模版“批量制作“7个课题档案袋“
背景需求 本学期的课题有4个大课题,3个小课题通过,需要做阶段资料。 一、初步设计 我很早以前就做好了Python代码(只有上学期),批量制作每个课题的阶段资料模版。因为小课题的编号没有出来,就一直没有发给…...
Objective-C语言的面向对象编程
Objective-C语言的面向对象编程探讨 引言 随着计算机科学的发展,编程语言也在不断演变。面向对象编程(OOP)作为一种重要的编程范式,已被广泛应用于软件开发中。Objective-C是一种基于C语言的面向对象编程语言,主要用…...

有限元分析学习——Anasys Workbanch第一阶段笔记(11)横梁中点挠度仿真结果与计算结果对比
目录 0 序言 1 求解横梁中点挠度案例 2 仿真计算求解 2.1 模型简化 2.2 前处理 2.3 计算结果 2 数值计算 3 结果对比 0 序言 本章主要介绍求解横梁的中点挠度的1/4对称算法和数值计算结果对比 有限元分析基本操作流程 1 求解横梁中点挠度案例 分析方案:压…...

GO语言实现KMP算法
前言 本文结合朱战立教授编著的《数据结构—使用c语言(第五版)》(以下简称为《数据结构(第五版)朱站立》)中4.4.2章节内容编写,KMP的相关概念可参考此书4.4.2章节内容。原文中代码是C语言&…...

【2024年华为OD机试】(A卷,100分)- 打印机队列(Java JS PythonC/C++)
一、问题描述 题目描述 有5台打印机打印文件,每台打印机有自己的待打印队列。 因为打印的文件内容有轻重缓急之分,所以队列中的文件有1~10不同的代先级,其中数字越大优先级越高。 打印机会从自己的待打印队列中选择优先级最高的文件来打印…...
SQL语言的面向对象编程
SQL语言的面向对象编程 引言 随着数据库技术的发展,SQL(结构化查询语言)逐渐成为数据管理和处理的标准语言。从最初的查询语言演变为更复杂的系统,SQL 现在不仅帮助开发者执行基本的查询,还支持了许多高级功能&#…...

android分区和root
线刷包内容: 线刷包是一个完整的android镜像,不但包括android、linux和用户数据,还包括recovery等。当然此图中没有recovery,但是我们可以自己刷入一个。 主要分区 system.img 系统分区,包括linux下主要的二进制程序。 boot.img…...

WebScoket-服务器客户端双向通信
文章目录 1. 消息推送常用方式介绍2. WebSocket2.1 介绍2.2 客户端API2.3 服务端API 3. 总结 1. 消息推送常用方式介绍 轮询 浏览器以指定的时间间隔向服务器发出HTTP请求,服务器实时返回数据给浏览器。 长轮询 浏览器发出ajax请求,服务器端接收到请求…...
如何在QT中保证线程是安全的?
在Qt中保证线程安全是一个重要的问题,尤其是在涉及多线程编程时。以下是一些保证线程安全的方法和策略: 1. 使用信号和槽机制 Qt的信号和槽机制本身提供了线程间的安全通信方式。当信号从一个线程发射到另一个线程时,槽函数会在接收信号的线…...
Lock接口
java.util.concurrent.locks.Lock 接口是Java并发包中的一部分,它提供了比内置锁(即 synchronized 关键字)更灵活和强大的锁机制。通过使用 Lock 接口及其相关实现类,开发者可以获得更多的功能选项来控制线程间的同步行为…...

02——变量
变量 1、变量的概念 用于存储数据 2、创建变量 变量名 变量值 变量必须先定义再使用 两边要留一个空格 3、变量的修改 创建变量后,可以在代码中重新赋值。 #不同类型变量也可以直接修改 money 十元 money 10 print(money)结果:10 4、变量的…...
MonacoEditor在vue3 element-plus的tabs非默认激活标签页中无法正常显示的问题
现象 在使用 el-tabs 组件时,如果 MonacoEditor 放在非默认激活的标签页中,可能会遇到初始化问题,导致 MonacoEditor 无法正常显示。这是因为 MonacoEditor 在初始化时需要一个可见的容器,而未激活的标签页在初始状态下是不可见的…...

【RedisStack】Linux安装指南
【RedisStack】Linux安装指南.md 前言下载解压创建启动文件设置密码把密码设置到环境变量启动/停止相关命令测试&验证官网资料参考资料 前言 Redis Stack是使用Redis的最佳起点。我们将我们必须提供的最好的技术捆绑在一起,形成一个易于使用的软件包。Redis St…...

说一说mongodb组合索引的匹配规则
一、背景 有一张1000多万条记录的大表,需要做归档至历史表,出现了大量慢查询。 查询条件是 "classroomId": {$in: ["xxx", "xxx", ..... "xxx","xxx", "xxx" ] }耗时近5秒,且…...

Maven核心插件之maven-resources-plugin
前言 Maven 插件是 Maven 构建系统的重要组成部分,它们为 Maven 提供了丰富的功能和扩展能力,使得 Maven 不仅是一个构建工具,更是一个强大的项目管理平台。在 Maven 项目中,插件的使用通常通过配置 pom.xml 文件来完成。每个插件…...

C++ 鼠标轨迹算法 - 防止游戏检测
一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序,它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言,原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势: 模拟…...
网络学习记录6
查找下一跳和流量如何通过,是网络路由的基本概念。下面我会尽量用通俗易懂的方式来解释这个过程。 查找下一跳 数据包的目的地:当一个数据包在网络中传输时,它的目标是一个特定的IP地址。 路由表的作用:路由器有一个叫做路由表的东…...
【数学】概率论与数理统计(四)
文章目录 [toc] 分布函数分布函数性质离散型随机变量的分布函数连续型随机变量的分布函数示例1问题解答 正态随机变量示例问题解答 示例2问题(1)(2) 解答(1)(2) 随机变量函数的分布离…...
小结:华为交换机常用的操作指令
以下是华为交换机常用的操作指令总结,按功能分类说明: 1. 系统管理 进入系统视图system-view返回用户视图quit保存配置save查看当前配置display current-configuration重启设备reboot2. 用户管理 配置用户密码local-user <username> password ir…...

轻松学51单片机--基于普中科技开发板练习蓝桥杯及机器人大赛等(8-DS1302实时时钟)
1、DS1302 DS1302是一款实时时钟芯片,可以用于实时计时和日期显示等应用。它具有低功耗、精度高、芯片体积小等特点,非常适合嵌入式系统和小型电子设备中使用。 DS1302具有多个功能和特性,包括: 时钟功能:可以显示年…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...

第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
BLEU评分:机器翻译质量评估的黄金标准
BLEU评分:机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域,衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标,自2002年由IBM的Kishore Papineni等人提出以来,…...

Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...

CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!
本文介绍了一种名为AnomalyAny的创新框架,该方法利用Stable Diffusion的强大生成能力,仅需单个正常样本和文本描述,即可生成逼真且多样化的异常样本,有效解决了视觉异常检测中异常样本稀缺的难题,为工业质检、医疗影像…...
【SpringBoot自动化部署】
SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一,能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时,需要添加Git仓库地址和凭证,设置构建触发器(如GitHub…...

springboot 日志类切面,接口成功记录日志,失败不记录
springboot 日志类切面,接口成功记录日志,失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...