【办公类-48-05】20261002每月电子屏台账汇总成docx(WPS版本)
一、背景需求需要每月制作电子屏原来电脑坏了我需要在新电脑里重写Python代码和Word模版【办公类-48-04】202506每月电子屏台账汇总成docx-5问卷星下载5月范围内容自动获取excel文件名并转移处理https://mp.csdn.net/mp_blog/creation/editor/148410815运气好微信里面还有一个docx模版修改一下把代码拿出来运行结果不行因为这台电脑没有win32只有WPS看来还是要安装微软没有显示电子屏ID和资产编号所有格子都写入了内容修改字体大小第一行应该是表格不是备注文字最终代码原始摆放模版、页码、xlsx放在一级文件夹下电子屏台账模版页码:引用这个Word最后合并后Word底部页脚是1、2、3、excle 电子屏台账【修复版】WPS版本 1.修复正则全角符号ID资产编号匹配 2.修复分页切片int除法截断导致序号丢失每页固定140单元格(20行*7列) 3.单元格强制宋体四号(14pt) 4.纯docx无COM组件依赖 豆包阿夏 20261002 print(----1、读取EXCEL内容并合并成关键列表------) import os import shutil import copy import re 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 # 请修改这里为你本机路径 path rD:\Python最终内容\20261002电子屏 year 2026 month int(input(几月4\n)) garden [总园, 一分园, 二分园] # 创建文件夹 folder_path os.path.join(path, f{year}年{month:02d}月) os.makedirs(folder_path, exist_okTrue) folder_name os.path.join(folder_path, f(以此为准{year}年{month:02d}月电子屏台账三个园区) os.makedirs(folder_name, exist_okTrue) # 查找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] src_file os.path.join(path, file_name) dst_file os.path.join(folder_path, file_name) shutil.move(src_file, dst_file) file_path os.path.join(folder_path, file_name) df pd.read_excel(file_path, dtypestr) filtered_rows df.iloc[:, 6:22].values.tolist() print(f原始读取行数{len(filtered_rows)}) rows [] for row in filtered_rows: dt str(row[9]).strip() if len(dt)7 and dt[5:7]f{month:02d}: rows.append(row) print(f筛选当月数据行数 rows{len(rows)}) # 正则【修复半角A-Z之前全角符号匹配失败】 re_id re.compile(r\b\d{12,}\b) re_asset re.compile(r\b(TY|DZ)[A-Z0-9]\b) # 处理每个园区 for x, garden_name in enumerate(garden): all_data [] for y in range(len(rows)): row rows[y] park_mark str(row[0]).strip() if len(park_mark)2 and park_mark[2:] garden_name: for item in row[1:]: s str(item).strip() if s ! (跳过): all_data.append(s) print(f\n {garden_name} ) print(fall_data长度:{len(all_data)}) 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: kong 0 Y 1 for z in range(20,220,20): if z len(nested_lists) z20: kong z20 - len(nested_lists) Y int((z20)/20) break w []*h nested_lists [copy.deepcopy(w) for _ in range(kong)] new [] for idx, n_item in enumerate(nested_lists): if not n_item or n_item[1] : new.extend([]*h) continue dev_text n_item[1].strip() print(f【调试设备文本】{dev_text}) id_match re_id.search(dev_text) asset_match re_asset.search(dev_text) id_str id_match.group() if id_match else asset_str asset_match.group() if asset_match else print(f提取结果ID{id_str} 资产{asset_str}) date_raw n_item[2] hh n_item[3].zfill(2) mm n_item[4].zfill(2) fmt_date f{date_raw[:4]}年{date_raw[5:7]}月{date_raw[-2:]}日{hh}:{mm} seq idx 1 op n_item[5] person n_item[0] leader n_item[6] new.append(seq) new.append(id_str) new.append(asset_str) new.append(fmt_date) new.append(op) new.append(person) new.append(leader) # 临时文件夹 imagePath os.path.join(folder_path, 零时Word) os.makedirs(imagePath, exist_okTrue) doc_template_path os.path.join(path, 电子屏台账模板.docx) bg [] for a in range(2, 22): for b in range(7): bg.append(f{a:02d}{b:02d}) # 【修复固定每页140单元格(20行*7列)不再用除法cint(len(new)/Y)解决序号丢失】 page_cell 20 * 7 content_lists [new[i:ipage_cell] for i in range(0, len(new), page_cell)] # 生成每一页临时docx强制单元格四号宋体14pt for n,page_data in enumerate(content_lists): doc Document(doc_template_path) table doc.tables[0] for t_idx,coord in enumerate(bg): pp int(coord[:2]) qq int(coord[2:4]) val str(page_data[t_idx]) if t_idx len(page_data) else cell table.cell(pp, qq) para cell.paragraphs[0] # 清空文字新建run强制【宋体 四号Pt(14)】 para.clear() run para.add_run(val) run.font.name 宋体 run.font.size Pt(14) run.font.color.rgb RGBColor(0, 0, 0) r run._element r.rPr.rFonts.set(qn(w:eastAsia), 宋体) para.alignment WD_PARAGRAPH_ALIGNMENT.CENTER save_tmp os.path.join(imagePath, f{n:02d}.docx) doc.save(save_tmp) time.sleep(0.15) # 纯python‑docx合并文档 # output_file os.path.join(folder_name, f{year}年{month:02d}月{garden_name}电子屏台账.docx) # combined_doc Document(doc_template_path) # combined_tbl combined_doc.tables[0] # combined_tbl._element.getparent().remove(combined_tbl._element) # tmp_files sorted([x for x in os.listdir(imagePath) if x.endswith(.docx)]) # for tf in tmp_files: # tdoc Document(os.path.join(imagePath, tf)) # for element in tdoc.element.body: # combined_doc.element.body.append(copy.deepcopy(element)) # 纯python‑docx合并文档【修复删除基底残留备注段落不让备注跑到文档开头】 output_file os.path.join(folder_name, f{year}年{month:02d}月{garden_name}电子屏台账.docx) combined_doc Document(doc_template_path) # 1. 删除模板自带表格 combined_tbl combined_doc.tables[0] combined_tbl._element.getparent().remove(combined_tbl._element) # 2. 重点修复删除基底文档全部残留段落把“注禁止使用人和审批领导为同一人”从头部清掉 for para in list(combined_doc.paragraphs): para._element.getparent().remove(para._element) tmp_files sorted([x for x in os.listdir(imagePath) if x.endswith(.docx)]) for tf in tmp_files: tdoc Document(os.path.join(imagePath, tf)) for element in tdoc.element.body: combined_doc.element.body.append(copy.deepcopy(element)) # 安全替换文字不破坏标题字体样式 def replace_text_in_doc(doc, old_text, new_text): for para in doc.paragraphs: for run in para.runs: if old_text in run.text: run.text run.text.replace(old_text, new_text) for tbl in doc.tables: for row in tbl.rows: for cell in row.cells: for para in cell.paragraphs: for run in para.runs: if old_text in run.text: run.text run.text.replace(old_text, new_text) replace_text_in_doc(combined_doc, 园区, garden_name) combined_doc.save(output_file) shutil.rmtree(imagePath) # 打包仅zip shutil.make_archive(folder_name, zip, folder_name) print(\n✅全部完成生成zip压缩包)运行后效果1.生成2026年09月文件夹excle从一级文件夹转入二级文件夹2026年09月2.生成三个园区文件夹3.三个docx三、附件上传备份本次制作了WPS版本的“电子屏汇总”关键还是把Word模版上传。以免下次再遗失重做模版。