)
背景需求1-4月电子屏表格都是用这个代码将EXCEL数据整理成分类成3个WORD表格。【办公类-48-04】20250118每月电子屏台账汇总成docx-4提取EXCLE里面1月份的内容自制月份文件夹-CSDN博客文章浏览阅读1.2k次点赞29次收藏9次。【办公类-48-04】20250118每月电子屏台账汇总成docx-4提取EXCLE里面1月份的内容自制月份文件夹https://blog.csdn.net/reasonsummer/article/details/145230274?spm1011.2415.3001.5331存在问题每月都要把下载EXCEL名称复制到代码内有点麻烦。我希望只要把EXCEL放到文件夹下程序就能自动转移到2025年5月文件夹内。并识别它做三个WORD表格deepseek的答案20250603获取5月的所有EXCEL导出文本EXCEL放到一级文件夹下然后用代码慢慢生成 电子屏台账2025年5月自动提取当月内容(在XX之间的内容制作当月文件夹 把EXCEL放在一级文件夹下自动读取它并转移到2025年5月文件夹 自动识别2025年5月文件夹内的EXCEL开始制作三个园区台账WORD并打包rar 作者星火讯飞、deepseek、阿夏 时间20240603 print(----1、读取EXCEL内容并合并成关键列表------) import os import shutil import pandas as pd path rC:\Users\jg2yXRZ\OneDrive\桌面\电子屏每月2024 year2025 # int(input(几年2025\n)) monthint(input(几月4\n)) garden[总园, 一分园,二分园] folder_path pathfr\{year}年{month:02}月 os.makedirs(folder_path,exist_okTrue) folder_namefolder_pathfr\(以此为准{year}年{month:02}月电子屏台账三个园区 os.makedirs(folder_name,exist_okTrue) # 把EXCLe复制到2025年1月文件夹 file_name 279855026_20240901Jg2y各园部重点部位电子屏、播控系统_956f958e-4232-47d7-a6bb-2c086e4ade44.xlsx # 把问卷星下载的xlsx转移到2025年1月文件夹内 # 定义源文件和目标文件夹路径 src_file pathfr\{file_name} dst_folder folder_path dst_file os.path.join(dst_folder, f{file_name}) # 移动文件到目标文件夹 shutil.move(src_file, dst_file) # 279855026_按文本_20240901Jg2y各园部重点部位电子屏、播控系统_83_83.xlsx file_path os.path.join(folder_path, file_name) print(file_path) # 按行读取 df pd.read_excel(file_path) filtered_rows df.iloc[:, 6:22].values.tolist() # G列到W列的数据按行转换为列表 # print(rows) # 提取符合的日期 print(----1、初始化一个空列表来存储符合条件的行数字是01的月份------) # rows [] # 遍历每一行 for row in filtered_rows: # 获取第9个元素索引从0开始所以是14 cell_value str(row[9]) # print(cell_value) # 检查第5-6个字符是否为“01” if cell_value[5:7] f{month:02}: rows.append(row) # # 打印符合条件的行 print(rows) for x in range(len(garden)): all_data[] for y in range(len(rows)): if rows[y][0][2:]garden[x]: # print(rows[y]) for row in rows[y][1:]: # print(row) if row(跳过): pass else: all_data.append(row) # print(all_data) # print(len(all_data)) # 462 print(----1、读取EXCEL内容并合并成关键列表------) import pandas as pd # # 每行有几个内容 h7 # print(h) # # 拆分成7个一组 nested_lists [all_data[i:ih] for i in range(0, len(all_data), h)] # print(nested_lists) # print(len(nested_lists)) # # # 26 # 如果条数不满20条只有一页 if len(nested_lists) 20: print(f{len(nested_lists)} 在范围 0-20 内) kong 20 - len(nested_lists) print(kong) Y 1 # 判断多页情况下最后一页是否能够凑满20行凑不满补空 else: for z in range(20, 220, 20): if z len(nested_lists) z 20: # 出现过正好40条只有两页但出现了第3空页少了小于等于z2- print(f{len(nested_lists)} 在范围 {z}-{z20} 内) # 补多少的空格 kong z 20 - len(nested_lists) print(kong) # 有几页 Y int((z 20) / 20) # 一个列表里面有7个空 w [] * h # 需要14个这种7空的嵌套列表 v [w] * kong # print(v) # 把实际的填写内容补充的空格凑满20的倍数页 nested_listsnested_listsv # print(nested_lists) # print(len(nested_lists)) # 80 # 拆分合并每个格子的内容 new[] for n in range(len(nested_lists)): # 66行 # 如果读取的第一个内容为空 if nested_lists[n][1]: for g in range(h): new.append() else: # 添加序号不用加0 new.append(n1) # 电子屏ID 总园 校门口电子屏 402XXXXXXXX TY2021XXXXXX split_list nested_lists[n][1].split( ) # print(split_list) # 将空格切开变成列表 new.append(split_list[2]) # 资产编号 new.append(split_list[3]) # 时间 日期时间 new.append(nested_lists[n][2][:4]年nested_lists[n][2][5:7]月 \ nested_lists[n][2][-2:]日str(nested_lists[n][3]):str(%02d%nested_lists[n][4])) # 操作内容 new.append(nested_lists[n][5]) # 进出人员 (负责人) new.append(nested_lists[n][0]) # 审核领导园所管理主任 new.append(nested_lists[n][6]) print(new) print(len(new)) # 560 /7/204页 print(----2、读取docx模板的数量------) # 读取word的行列数 from docx import Document doc_name 电子屏台账模板.docx doc_path os.path.join(path, doc_name) # 打开文档 doc Document(doc_path) # 获取第一个表格 table doc.tables[0] # 获取表格的行数和列数 num_rows len(table.rows) num_cols len(table.columns) # print(行数:, num_rows) # # 22 # print(列数:, num_cols) # 7 # 每页格子的坐标 bg[] for a in range(2,22): for b in range(7): bg.append({}{}.format(%02d%a,%02d%b)) # print(bg) # print(len(bg)) # 140 # 拆分成4页每页20个个一组 cint(len(new)/Y) content_lists [new[i:ic] for i in range(0, len(new), c)] # print(content_lists) # print(len(content_lists)) # 15 # 4 拆20行内容一组一共4个嵌套列表 # 列表new内容写入docx模板,第一页写入20行*7的内容 import os,time from docx import Document from docx.shared import Pt, RGBColor from docx.enum.text import WD_PARAGRAPH_ALIGNMENT from docx.oxml.ns import qn from docx2pdf import convert from PyPDF2 import PdfMerger # 多少份必须双数 ziti 宋体 size 14 imagePath folder_pathr\零时Word if not os.path.exists(imagePath): os.makedirs(imagePath) for n in range(len(content_lists)): doc Document(doc_path) # for b in range(0): table doc.tables[0] for t in range(len(bg)): pp, qq, k int(bg[t][0:2]), int(bg[t][2:4]), content_lists[n][t] run table.cell(pp, qq).paragraphs[0].add_run(str(k)) run.font.name ziti run.font.size Pt(size) run.bold False run.font.color.rgb RGBColor(0, 0, 0) r run._element r.rPr.rFonts.set(qn(w:eastAsia), ziti) table.cell(pp, qq).paragraphs[0].alignment WD_PARAGRAPH_ALIGNMENT.CENTER doc.save(imagePathfr\{n:02d}.docx) time.sleep(2) print(-----3、创建一个带页码的docx,合并word模板------) from docx import Document from docx.enum.section import WD_SECTION_START import os from docx.shared import Cm # # 创建一个带页码的空Document对象,并把页眉页脚边距改小 source_dir imagePath # 文件夹路径 combined_doc Document(pathr\页码.docx) # 读取“整理”里面的docx的内容 docx_files [] for file_name in os.listdir(source_dir): if file_name.endswith(.docx): docx_files.append(os.path.join(source_dir, file_name)) for file in docx_files: doc Document(file) for element in doc.element.body: combined_doc.element.body.append(element) output_file folder_name fr\{year}年{month:02}月{garden[x]}电子屏台账.docx # 输出文件路径 output_file1 folder_name fr\{year}年{month:02}月{garden[x]}电子屏台账2.docx # 输出文件路径 combined_doc.save(output_file) time.sleep(2) print(-----4、把“合并docx的第一段回车删除。页码模板自带---) doc Document(output_file) # 删除第1个段落都只有一个回车 for i in [0]: dell_paragraph doc.paragraphs[i] doc._element.body.remove(dell_paragraph._element) # 保存文档 doc.save(output_file) # time.sleep(2) print(-----5、替换园区---) import win32com.client as win32 # 创建Word应用程序对象 word_app win32.gencache.EnsureDispatch(Word.Application) # 打开Word文档 doc word_app.Documents.Open(output_file) # 创建Find对象 find_object doc.Content.Find # 设置查找和替换参数 find_object.Text 园区 find_object.Replacement.Text garden[x] find_object.Forward True find_object.Wrap 1 find_object.Format False find_object.MatchCase False find_object.MatchWholeWord False find_object.MatchWildcards False find_object.MatchSoundsLike False find_object.MatchAllWordForms False # 执行查找和替换 find_object.Execute(Replace2) # 保存文档 doc.SaveAs(output_file) # 关闭文档和应用程序 doc.Close() word_app.Quit() time.sleep(2) # 删除word临时文件夹 import shutil shutil.rmtree(imagePath) # 定义要打包的文件夹名称 shutil.make_archive(folder_name, zip, folder_name)以上那个不对 电子屏台账2025年1月自动提取当月内容制作当月文件夹 问卷星下载时文本Excel、三个园区一起制作台账EXCEL并打包rar 作者星火讯飞、阿夏 时间20240118 print(----1、读取EXCEL内容并合并成关键列表------) import os import shutil import pandas as pd from docx import Document from docx.shared import Pt, RGBColor from docx.enum.text import WD_PARAGRAPH_ALIGNMENT from docx.oxml.ns import qn import time from PyPDF2 import PdfMerger import win32com.client as win32 # 基础路径 path rC:\Users\jg2yXRZ\OneDrive\桌面\电子屏每月2024 # 用户输入年份和月份 year 2025 # int(input(几年2025\n)) month int(input(几月4\n)) # 园区列表 garden [总园, 一分园, 二分园] # 创建当月文件夹 folder_path path fr\{year}年{month:02}月 os.makedirs(folder_path, exist_okTrue) # 创建台账文件夹 folder_name folder_path fr\(以此为准{year}年{month:02}月电子屏台账三个园区 os.makedirs(folder_name, exist_okTrue) # 获取 path 目录下的第一个 Excel 文件 excel_files [f for f in os.listdir(path) if f.lower().endswith((.xlsx, .xls))] if not excel_files: raise FileNotFoundError(f在目录 {path} 中未找到 Excel 文件) file_name excel_files[0] # 取第一个 Excel 文件 # 把问卷星下载的xlsx转移到当月文件夹内 src_file os.path.join(path, file_name) dst_file os.path.join(folder_path, file_name) shutil.move(src_file, dst_file) # 读取Excel文件 file_path os.path.join(folder_path, file_name) df pd.read_excel(file_path) filtered_rows df.iloc[:, 6:22].values.tolist() # G列到W列的数据 # 提取符合当月日期的行 rows [] for row in filtered_rows: cell_value str(row[9]) if cell_value[5:7] f{month:02}: rows.append(row) # 处理每个园区的数据 for x in range(len(garden)): all_data [] for y in range(len(rows)): if rows[y][0][2:] garden[x]: for row in rows[y][1:]: if row ! (跳过): all_data.append(row) # 每行7个内容 h 7 nested_lists [all_data[i:ih] for i in range(0, len(all_data), h)] # 计算需要补充的空行 if len(nested_lists) 20: kong 20 - len(nested_lists) Y 1 else: for z in range(20, 220, 20): if z len(nested_lists) z 20: kong z 20 - len(nested_lists) Y int((z 20) / 20) # 补充空行 w [] * h v [w] * kong nested_lists nested_lists v # 整理数据格式 new [] for n in range(len(nested_lists)): if nested_lists[n][1] : for g in range(h): new.append() else: new.append(n 1) split_list nested_lists[n][1].split( ) new.append(split_list[2]) new.append(split_list[3]) new.append(nested_lists[n][2][:4] 年 nested_lists[n][2][5:7] 月 nested_lists[n][2][-2:] 日 str(nested_lists[n][3]) : str(%02d % nested_lists[n][4])) new.append(nested_lists[n][5]) new.append(nested_lists[n][0]) new.append(nested_lists[n][6]) # 创建临时Word文件夹 imagePath folder_path r\零时Word if not os.path.exists(imagePath): os.makedirs(imagePath) # 读取模板 doc_name 电子屏台账模板.docx doc_path os.path.join(path, doc_name) doc Document(doc_path) table doc.tables[0] num_rows len(table.rows) num_cols len(table.columns) # 生成表格坐标 bg [] for a in range(2, 22): for b in range(7): bg.append({}{}.format(%02d % a, %02d % b)) # 拆分内容为多页 c int(len(new) / Y) content_lists [new[i:ic] for i in range(0, len(new), c)] # 生成Word文档 ziti 宋体 size 14 for n in range(len(content_lists)): doc Document(doc_path) table doc.tables[0] for t in range(len(bg)): pp, qq, k int(bg[t][0:2]), int(bg[t][2:4]), content_lists[n][t] run table.cell(pp, qq).paragraphs[0].add_run(str(k)) run.font.name ziti run.font.size Pt(size) run.bold False run.font.color.rgb RGBColor(0, 0, 0) r run._element r.rPr.rFonts.set(qn(w:eastAsia), ziti) table.cell(pp, qq).paragraphs[0].alignment WD_PARAGRAPH_ALIGNMENT.CENTER doc.save(imagePath fr\{n:02d}.docx) time.sleep(2) # 合并Word文档并添加页码 combined_doc Document(os.path.join(path, 页码.docx)) for file_name in os.listdir(imagePath): if file_name.endswith(.docx): doc Document(os.path.join(imagePath, file_name)) for element in doc.element.body: combined_doc.element.body.append(element) output_file folder_name fr\{year}年{month:02}月{garden[x]}电子屏台账.docx combined_doc.save(output_file) time.sleep(2) # 删除第一个空段落 doc Document(output_file) dell_paragraph doc.paragraphs[0] doc._element.body.remove(dell_paragraph._element) doc.save(output_file) # 替换园区为实际园区名称 word_app win32.gencache.EnsureDispatch(Word.Application) doc word_app.Documents.Open(output_file) find_object doc.Content.Find find_object.Text 园区 find_object.Replacement.Text garden[x] find_object.Execute(Replace2) doc.SaveAs(output_file) doc.Close() word_app.Quit() # 删除临时文件夹 shutil.rmtree(imagePath) # 打包最终文件夹 shutil.make_archive(folder_name, zip, folder_name) print(处理完成)excel转移到2025年05月文件夹内。最后效果20251231补10月-12的电子屏其中11月总是报错搞了几个小时问了豆包无数次最后彩发现是某一个内容没有填写完整复制成上面的一串内容后就正确执行了生成后要检查WORD如果总条数是奇数就可能会漏写手动补全。再打包rar-----20260131学期最后一天补1月电子屏记录----检查表单发现没有二分园记录请负责老师补几条匆忙补的记录顺序有点乱我下载时要把时间也做一下顺序只有筛选和隐藏没有升序降序下载后在Excel里面做升序降序全部按照日期排序再运行一次程序检查WORD内容排序是否日期排序正确内容有无缺失正常开机关机这次按照日期排序了但是填写内容有填写误差应该是新建关机ABAB排列手动修改多填写的删除再手动打包