一、背景需求9月1日我用Python微信每个班主任发送了自己的班级的”国旗下讲话有文字版。【办公类-119-03】20260901三个园区“国旗下讲话” 按班级组合docx模板AIexcelpython、deepseek和豆包、微信自动私发https://mp.csdn.net/mp_blog/creation/editor/164123764过几天在校门口刷卡时正好遇到托3班的班主任S老师她热情地表示感谢说“阿夏你太厉害了把国旗下讲话都做好了这个太方便了我和G老师年纪大了看电脑都看不清老花眼你做这个真的帮了大忙了”我想到托3班今年的特殊情况1.两位班主任都超过50岁了年长者都会有“老花眼”问题。一般班级总是一位年轻教师和一位老教师搭班因此电子资料由年轻老师写。但是缩班后实在凑不到年轻老师而且其中一位老教师正好明年6月退休。2.托3班是今年新增的托班并没有现成的托班资料。2024和2025学年都只有2个托班——托1班和托2班2026学年新增托3班意味着托3班今年重新做一套新资料这对两位老教师来说更费劲。所以我提出用编程给托3班做“家园共育主题墙贴墙四件套”班主任欣然应允。二、分析托班资料结构和板式20260909正好去一分园带班拍摄了托1班和托2班的家园共育主题墙。托2班有周计划、育儿知识、信息窗没有主题知识托1班有周计划、育儿知识、信息窗没有主题知识因为托3班用的就是托1班的资料所以我没份都特写拍摄然后我又问二分园托3班要了他们的家园共育主题墙版面和托1班的样式一模一样用了白纸也是只有周计划、育儿知识、信息窗没有主题知识把下载的资料分类二、制作“育儿知识”一制作Word模版1.复制并制作word模版2.更换背景图还需要更换内容和教师名字。3.豆包制作背景图我选了第一个用PPT修图不好修图很好统一白色255、255、255后冲蚀效果很干净透明色4.添加占位符字母二制作excle标题把“四大教育”代码复制一下 育儿知识托3班 excle的列标题制作占位符字母 豆包、Deepseek、阿夏 2026096 import pandas as pd import os # 路径配置 BASE_PATH rD:\Python最终内容\20260909托3班资料制作\00育儿知识 CLASS_NAME 托3班 EDU_THEME 全部主题 date 20260910 EXCEL_PATH os.path.join(BASE_PATH, f{date}{CLASS_NAME}育儿知识{EDU_THEME}.xlsx) # 表头字段【已改成docx模板里面{{}}内的标识符】 columns [ title, content, T1,T2,classroom,yearmonth ] def create_empty_excel_header_only(): 只生成仅有表头的Excel没有数据行 os.makedirs(BASE_PATH, exist_okTrue) df pd.DataFrame(columnscolumns) df.to_excel(EXCEL_PATH, indexFalse) print(f✅ 已生成仅带表头的Excel) print(f 文件路径{EXCEL_PATH}) print(f 表头{columns}) if __name__ __main__: create_empty_excel_header_only()三豆包制作文字我希望根据附件 9-1 月的育儿知识内容重新生成相似的内容标题 title 和内容 content 都不能一模一样、content 大约 450-480 字要制作 3-6 段文字每段用 aaa 分隔T1 赵T2 钱。制作成表格样式。把Word模版重新制作生成标题把AI文字复制到EXCEL内四excle批量生成Word、合并PDF打印 托3班育儿知识5个月主题 完整工作流 1. 生成占位符Excel 2. 根据Excel生成Word文档 3. 处理Word文档aaa转手动换行符、空格缩进 4. 打包成RAR 豆包、Deepseek、阿夏 20260910 import pandas as pd from docxtpl import DocxTemplate from docx import Document from docx.enum.text import WD_BREAK import os import sys import subprocess import zipfile # 全局路径配置只需修改这里 BASE_PATH rD:\Python最终内容\20260909托3班资料制作\00育儿知识 CLASS_NAME 托3班 EDU_THEME 全部主题 # EXCEL_PATH os.path.join(BASE_PATH, f20260910{CLASS_NAME}育儿知识{EDU_THEME}.xlsx) TEMPLATE_PATH os.path.join(BASE_PATH, 育儿知识模版.docx) OUTPUT_FOLDER os.path.join(BASE_PATH, f01 {CLASS_NAME}育儿知识_{EDU_THEME}) PROCESSED_FOLDER os.path.join(BASE_PATH, f01 {CLASS_NAME}育儿知识_{EDU_THEME}最终) RAR_PATH os.path.join(BASE_PATH, f01 {CLASS_NAME}育儿知识_{EDU_THEME}最终.rar) ZIP_PATH os.path.join(BASE_PATH, f01 {CLASS_NAME}育儿知识_{EDU_THEME}最终.zip) # windows控制台编码 if sys.platform win32: import io sys.stdout io.TextIOWrapper(sys.stdout.buffer, encodingutf-8) # def step1_generate_excel(): # 第一步生成占位符Excel文件【育儿知识字段】 # print(\n *60) # print(第一步生成占位符Excel文件) # print(*60) # os.makedirs(BASE_PATH, exist_okTrue) # # 和docx模板占位符完全对应 # df pd.DataFrame(columns[ # title, content, classroom, T1, T2, year, month # ]) # df.to_excel(EXCEL_PATH, indexFalse) # print(f✅ Excel文件已生成{EXCEL_PATH}) # input(\n请先在Excel中填入AI生成的内容然后按回车键继续...) # return True def step2_generate_word_from_excel(): 第二步根据Excel生成Word文档 print(\n *60) print(第二步根据Excel生成Word文档) print(*60) os.makedirs(OUTPUT_FOLDER, exist_okTrue) generated_files [] if not os.path.exists(EXCEL_PATH): print(f❌ 错误Excel不存在 - {EXCEL_PATH}) return False if not os.path.exists(TEMPLATE_PATH): print(f❌ 错误模板文件不存在 - {TEMPLATE_PATH}) return False schedule pd.read_excel(EXCEL_PATH) # 全部字段转字符串nan替换为空 col_list [title,content,classroom,T1,T2,year,month] for col in col_list: if col in schedule.columns: schedule[col] schedule[col].astype(str).replace(nan, ) # 设置默认值 if classroom not in schedule.columns: schedule[classroom] CLASS_NAME if T1 not in schedule.columns: schedule[T1] if T2 not in schedule.columns: schedule[T2] if year not in schedule.columns: schedule[year] 2026 if month not in schedule.columns: schedule[month] 9 schedule.to_excel(EXCEL_PATH, indexFalse) print(f✅ 已保存安排表) print(f 安排表共有 {len(schedule)} 行数据) # 校验模板 try: Document(TEMPLATE_PATH) print(✅ 模板文件验证通过开始生成文档...) except Exception as e: print(f❌ 模板文件无效: {e}) return False # 循环逐行渲染模板 for index, row in schedule.iterrows(): try: tpl DocxTemplate(TEMPLATE_PATH) classroom str(row[classroom]).strip() if pd.notna(row[classroom]) else CLASS_NAME # 模板上下文 和 {{占位符}}一一对应 context { title: str(row[title]) if pd.notna(row[title]) else , content: str(row[content]) if pd.notna(row[content]) else , classroom: classroom, T1: str(row[T1]) if pd.notna(row[T1]) else , T2: str(row[T2]) if pd.notna(row[T2]) else , year: str(row[year]) if pd.notna(row[year]) else 2026, month: str(row[month]) if pd.notna(row[month]) else 9, } tpl.render(context) temp_path os.path.join(OUTPUT_FOLDER, ftemp_{index}.docx) tpl.save(temp_path) doc Document(temp_path) # 文件名 month_str str(row[month]) if pd.notna(row[month]) else str(index1) title_short str(row[title])[:15] if pd.notna(row[title]) else 育儿知识 filename f{title_short}{month_str}月.docx file_full_path os.path.join(OUTPUT_FOLDER, filename) doc.save(file_full_path) if os.path.exists(temp_path): os.remove(temp_path) generated_files.append(file_full_path) print(f✅ 生成文档: {filename}) except Exception as e: print(f❌ 生成第{index1}行文档失败: {str(e)}) import traceback traceback.print_exc() continue print(f\n 文档生成完成共生成 {len(generated_files)} 个文档) print(f 文档保存在: {OUTPUT_FOLDER}) return True def process_word_document(input_path, output_path): 处理单个Word文档aaa替换为手动换行符 try: doc Document(input_path) modified False # 遍历所有段落处理aaa分隔符 for para in doc.paragraphs: if aaa in para.text: runs_info [] for run in para.runs: runs_info.append({ text: run.text, bold: run.bold, italic: run.italic, underline: run.underline, font_name: run.font.name, font_size: run.font.size, }) full_text para.text parts full_text.split(aaa) para.clear() for i, part in enumerate(parts): if part.strip(): run para.add_run(part) if runs_info: run.bold runs_info[0][bold] run.italic runs_info[0][italic] run.underline runs_info[0][underline] run.font.name runs_info[0][font_name] run.font.size runs_info[0][font_size] if i len(parts) - 1: para.add_run().add_break(WD_BREAK.LINE) modified True doc.save(output_path) return os.path.exists(output_path), modified except Exception as e: print(f 错误: {str(e)}) import traceback traceback.print_exc() return False, False def step3_process_documents(): 第三步处理word文档 aaa转手动换行 print(\n *60) print(第三步处理Word文档aaa转手动换行符) print(*60) os.makedirs(PROCESSED_FOLDER, exist_okTrue) print(f输入文件夹: {OUTPUT_FOLDER}) print(f输出文件夹: {PROCESSED_FOLDER}) if not os.path.exists(OUTPUT_FOLDER): print(f❌ 错误: 输入文件夹不存在!) return False docx_files [f for f in os.listdir(OUTPUT_FOLDER) if f.lower().endswith(.docx)] if not docx_files: print(f⚠️ 没有找到docx文件!) return False print(f\n✅ 找到 {len(docx_files)} 个docx文件) success 0 for i, filename in enumerate(docx_files, 1): print(f[{i}/{len(docx_files)}] {filename}) input_path os.path.join(OUTPUT_FOLDER, filename) output_filename filename.replace(.docx, .doc) output_path os.path.join(PROCESSED_FOLDER, output_filename) result, modified process_word_document(input_path, output_path) if result: print(f ✅ 已处理保存) success 1 else: print(f ❌ 处理失败) print() print(f\n✅ 处理完成成功处理 {success}/{len(docx_files)} 个文件) print(f 处理后文档保存在: {PROCESSED_FOLDER}) return True def check_winrar_installed(): 检查WinRAR possible_paths [ rC:\Program Files\WinRAR\WinRAR.exe, rC:\Program Files (x86)\WinRAR\WinRAR.exe ] for path in possible_paths: if os.path.exists(path): return path return None def create_zip_backup(): 无WinRAR时生成zip try: print( 正在创建ZIP压缩文件...) with zipfile.ZipFile(ZIP_PATH, w, zipfile.ZIP_DEFLATED) as zipf: for root, _, files in os.walk(PROCESSED_FOLDER): for file in files: fp os.path.join(root, file) arc os.path.relpath(fp, PROCESSED_FOLDER) zipf.write(fp, arc) if os.path.exists(ZIP_PATH): size_kb os.path.getsize(ZIP_PATH)/1024 print(f✅ ZIP打包成功size:{size_kb:.2f}KB) print(注意没有WinRAR输出为zip需要rar请手动安装WinRAR) return True return False except Exception as e: print(f❌ ZIP打包出错:{e}) return False def step4_pack_to_rar(): 第四步打包RAR/ZIP print(\n *60) print(第四步打包成RAR文件) print(*60) if not os.path.exists(PROCESSED_FOLDER): print(f❌ 错误最终文件夹不存在 {PROCESSED_FOLDER}) return False file_list os.listdir(PROCESSED_FOLDER) if len(file_list) 0: print(f⚠️ 文件夹为空跳过打包) return False winrar_exe check_winrar_installed() if winrar_exe: try: cmd [winrar_exe, a,-ep1,-r,RAR_PATH,f{PROCESSED_FOLDER}\\*.*] subprocess.run(cmd, capture_outputTrue, textTrue) if os.path.exists(RAR_PATH): kb os.path.getsize(RAR_PATH)/1024 print(f✅ RAR打包成功 {RAR_PATH} 大小{kb:.2f}KB) return True except Exception as e: print(fWinRAR异常 {e}回退zip) print(未检测WinRAR执行zip打包) return create_zip_backup() def main(): print(\n *60) print(托3班育儿知识完整工作流) print(*60) print(f基础路径:{BASE_PATH} 班级:{CLASS_NAME} 主题:{EDU_THEME}) print(*60) # 步骤1生成Excel占位表需要手动填数据后回车继续 # if not step1_generate_excel(): # print(❌第一步失败退出) # return # 步骤2excel批量生成word if not step2_generate_word_from_excel(): print(❌第二步失败退出) return # 步骤3处理aaa换行 if not step3_process_documents(): print(❌第三步失败退出) return # 步骤4压缩包 step4_pack_to_rar() print(\n *60) print(全部流程完成) print(f1.Excel:{EXCEL_PATH}) print(f2.原始word:{OUTPUT_FOLDER}) print(f3.处理后word:{PROCESSED_FOLDER}) if os.path.exists(RAR_PATH): print(f4.RAR包:{RAR_PATH}) elif os.path.exists(ZIP_PATH): print(f4.ZIP包:{ZIP_PATH}) print(*60) if __name__ __main__: main()未完待续
企业数字化 ERP 产品动态
相关推荐
Ubuntu20.04安装OpenCL Ubuntu20.04安装OpenCL
OpenCL(全称 Open Computing Language,开放计算语言)是一个面向异构系统进行并行编程的开放式、免版税标准。可以把它理解为一套通用的“翻译规则”,让开发者能用一份代码,调动电脑里不同类型的… · 2026/9/24 17:14:55
2026年四款主流DAM系统横向对比:Adobe、Bynder、某赞、龙孚 作者:龙孚售前助理 选型评测专栏。本文基于公开资料与客户反馈整理,客观对比,不吹不黑。阅读约 8 分钟。写在前面最近很多客户问我:市面上 DAM 这么多,到底怎么选?今天我把四款主流产品拉出来做个横向对比… · 2026/9/24 17:14:55
Ubuntu20.04安装Vulkan Ubuntu20.04安装Vulkan
Vulkan是由科纳斯组织(Khronos Group)主导开发的跨平台、低开销的图形与计算应用程序接口(API)。它旨在为开发者提供更直接、更精细的GPU(图形处理器)控制能力,以充分发… · 2026/9/24 17:14:55
Wayland与Xorg切换实操:Debian 13与Ubuntu 22.04配置指南 最近这段日子,我身边因为 Wayland 和 Xorg 切换炸毛的朋友比往年加起来都多。一边是刚装上 Debian 13(Trixie)的朋友,拿着 NVIDIA 显卡发现 GNOME 登录界面死活只有 Xorg 一个会话可选,查到的老教程全在讲“注销重选”… · 2026/9/24 19:09:04
Jev专题:Agent记忆控制能不用LLM吗?Jev-Mem建库提速6.6倍 (1)《三年面试五年模拟》AIGC / LLM / AI Agent 算法工程师与开发工程师求职面试秘籍,独家资源见 WeThinkIn/AIGC-Interview-Book,欢迎 Star! (2)AIGC / LLM / AI Agent 算法岗与开发岗求职面试… · 2026/9/24 19:09:04
HarmonyOS通用文字识别实践:从端侧OCR到AI Agent的完整落地 1. 通用文字识别的技术底座:从像素到文本的转化逻辑1.1 为什么HarmonyOS应用需要通用文字识别先聊一个很常见的场景:用户在聊天界面里发来一张带有订单号的截图,你需要提取里面的数字去查询物流;或者一个办公App需要在拍照后自动识… · 2026/9/24 19:09:04
资产配置模型实战:从马科维茨到风险平价,Python实现与避坑指南 简介:这份资源围绕均值方差资产配置模型展开,面向金融工程、量化投资方向的学习者与研究者,帮助其理解现代投资组合理论中风险与收益的权衡方法。压缩包共2个文件,包含1个m脚本与1个xlsx数据表,整体约36KB,… · 2026/9/24 19:09:04
AI 日报(2026年9月23日) 今日主题:OpenAI与Anthropic双线发力性价比模型,高通与国产算力重构智能体底座 本期概览:今日前沿模型赛道迎来激烈竞逐:OpenAI推出价格减半的GPT-6 Sol与Luna,Anthropic发布比肩旗舰性能且成本大幅下降的Claude Opus … · 2026/9/24 19:09:04
二手房房价预测Python实战:数据清洗到机器学习建模全流程 简介:基于链家网二手房交易数据,这套项目源码覆盖从数据爬取、清洗、分析到房价预测的完整流程。项目获导师认可并以98分通过毕业设计答辩,适合计算机相关专业正在准备毕业设计、课程设计或期末大作业的学生,也适合需要真实项目练… · 2026/9/24 19:08:44
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程 简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13
1D-CNN时间序列建模实战:从Conv1d原理到工业落地 简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26
柔软的L:汉语语流中被忽视的舌肌张力控制 1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44