【办公类-89-02】20250424会议记录模版WORD自动添加空格补全下划线
背景需求
4月23日听了一个MJB的征文培训,需要写会议记录
把资料黏贴到模版后,发现每行需要有画满下划线
原来做这套资料,就是手动按空格到一行末,有空格才会出现下划线,也就是要按很多的空格(凑满一行)
或者一行行的复制复制,因为文字有长短,所以后面的空格也有长有短
需求:
Python批量自动给最后添加适合的空格数,自动实现没有文字,但有空格,有下划线
第1问
代码展示
from docx import Documentdef add_solid_underline_with_spaces(doc_path, output_path, target_length=29):"""为Word文档每段添加实线下划线,并用全角空格填充至指定长度(仅对每段最后一行末尾添加空格和下划线)参数:doc_path (str): 输入文档路径output_path (str): 输出文档路径target_length (int): 目标字符宽度(中文算2,英文算1)"""# 加载文档doc = Document(doc_path)for paragraph in doc.paragraphs:if paragraph.text.strip(): # 只处理非空段落# 获取段落的最后一行lines = paragraph.text.split('\n')last_line = lines[-1] if lines else ""# 计算最后一行的字符宽度current_width = sum(2 if ord(c) > 127 else 1 for c in last_line)# 计算需要填充的全角空格数fill_count = max(0, target_length - current_width)# 计算需要填充的全角空格数fill_count = max(0, target_length - current_width)# print(f"段落内容: '{text}'")print(f"当前宽度: {current_width}, 需要填充空格数: {fill_count}\n")# 为原有内容添加实线下划线for run in paragraph.runs:run.font.underline = True # 设置为单实线# 仅在最后添加全角空格并带下划线if fill_count > 0:# 清除原有换行符(如果有)if paragraph.runs and paragraph.runs[-1].text.endswith('\n'):paragraph.runs[-1].text = paragraph.runs[-1].text.rstrip('\n')fill_run = paragraph.add_run("\u3000" * fill_count) # 使用全角空格fill_run.font.underline = True# 恢复原有换行符(如果有)if len(lines) > 1:paragraph.add_run().add_break()# 保存文档doc.save(output_path)# 使用示例
path = r'C:\Users\jg2yXRZ\OneDrive\桌面\工具运用'
input_path = path + r'\附件1工具运用训会议记录(2025.4.23).docx'
output_path = path + r'\附件1工具运用训会议记录(2025.4.23)_实线下划线.docx'
add_solid_underline_with_spaces(input_path, output_path, target_length=29)
出现很多的方块
把全角改成空格
结果方块没有了,但是下划线不够长,
分析:预设29个空格位置,已有字符超过29个,就不添加空格了
所以把预设空格数改到最大1000
运行后,都有空格了
结果显示
但是里面有大量的空格,会不会占空间?
结果显示:
如果设置1000字以上,空格太多,大小1.13
如果设置500字以上,大小变为22.3K
问题:
可是我并不知道每一段的总字数是多少,现在给所有段落默认添加1000字符,如果一段文字大于1000字,还是会没有空格和下划线。同时其他段落标题只有4-10个字,根本不需要填充1000字空格。
第2问:计算原有字符数+额外加多少空格下划线
手动测算一行有几个空
默认加78空,保证下划线肯定能撑满
代码展示
from docx import Documentz=78def add_dynamic_underline(doc_path, output_path, extra_length=z):"""为Word文档每段添加实线下划线,动态计算每段长度并额外增加指定字符数用全角空格填充至(实际长度+extra_length)的宽度参数:doc_path (str): 输入文档路径output_path (str): 输出文档路径extra_length (int): 每段额外增加的字符宽度"""# 加载文档doc = Document(doc_path)for paragraph in doc.paragraphs:if paragraph.text.strip(): # 只处理非空段落# 获取段落的最后一行lines = paragraph.text.split('\n')last_line = lines[-1] if lines else ""# 计算最后一行的字符宽度(中文算2,英文算1)current_width = sum(2 if ord(c) > 127 else 1 for c in last_line)# 动态设置目标长度 = 当前宽度 + 额外长度target_length = current_width + extra_length# 计算需要填充的全角空格数fill_count = max(0, target_length - current_width)print(f"段落内容: '{last_line}'")print(f"当前宽度: {current_width}, 目标宽度: {target_length}, 需要填充空格数: {fill_count}\n")# 为原有内容添加实线下划线for run in paragraph.runs:run.font.underline = True # 设置为单实线# 仅在最后添加全角空格并带下划线if fill_count > 0:# 清除原有换行符(如果有)if paragraph.runs and paragraph.runs[-1].text.endswith('\n'):paragraph.runs[-1].text = paragraph.runs[-1].text.rstrip('\n')fill_run = paragraph.add_run(" " * fill_count) # 使用全角空格fill_run.font.underline = True# 恢复原有换行符(如果有)if len(lines) > 1:paragraph.add_run().add_break()# 保存文档doc.save(output_path)# 使用示例
path = r'C:\Users\jg2yXRZ\OneDrive\桌面\工具运用'
input_path = path + r'\附件1工具运用训会议记录(2025.4.23).docx'
output_path = path + r'\附件1工具运用训会议记录(2025.4.23)_动态下划线.docx'
add_dynamic_underline(input_path, output_path, extra_length=z)
虽然打印时看不见,但我觉得右边距上一推灰点和回车,还是不好看,希望右边距上的点子不要出现。
第3问
计算一行可以有多少个字符
手动输入满一行
from docx import Documentdef count_width_per_line(doc_path):"""统计 Word 文档中每一行的宽度(中文=2,英文=1)"""doc = Document(doc_path)for i, paragraph in enumerate(doc.paragraphs, 1):if not paragraph.text.strip(): # 跳过空行continuelines = paragraph.text.split('\n') # 按换行符分割for j, line in enumerate(lines, 1):if not line.strip(): # 跳过空行continue# 计算宽度(中文=2,英文=1)width = sum(2 if ord(c) > 127 else 1 for c in line)print(f"第 {i} 段,第 {j} 行 | 宽度: {width} | 字符数: {len(line)} | 内容: '{line}'")print("\n统计完成!")# 使用示例
path = r'C:\Users\jg2yXRZ\OneDrive\桌面\工具运用'
doc_path = path + r'\附件1工具运用训会议记录(2025.4.23).docx'
count_width_per_line(doc_path)
计算一行可以有多少个字符=69个
第4问:每段最后一行有有几个汉字,69减去最后一行的汉字的树数目就是添加额外的空格数量
把都是汉字字符,是双数字符,尝试把69改成70
正好,都显示满了
代码展示
'''
会议记录自动补全下划线根据字数添加补全剩余空格下划线
deepseek \阿夏
20250424
'''
from docx import Document# 每行标准宽度(中文=2,英文=1)
h = 70def add_dynamic_underline(doc_path, output_path):"""为Word文档每段添加实线下划线,动态计算每段行数并调整下划线长度并保持原有字体格式参数:doc_path (str): 输入文档路径output_path (str): 输出文档路径"""doc = Document(doc_path)for paragraph in doc.paragraphs:if paragraph.text.strip(): # 只处理非空段落# 获取段落的最后一行lines = paragraph.text.split('\n')last_line = lines[-1] if lines else ""# 计算最后一行的字符宽度(中文算2,英文算1)current_width = sum(2 if ord(c) > 127 else 1 for c in last_line)# 计算该段有多少行(向上取整)line_count = current_width // hif line_count <1:line_count = 1extra_length = h - current_width else:extra_length = h - (current_width - line_count*h)print(f"段落内容: '{last_line}'")print(f"当前宽度: {current_width},汉字和英文的字符长度:'{len(last_line)}', 每行宽度: {h}, 行数: {line_count}")print(f"额外下划线长度: {extra_length}\n")# print(f"当前宽度: {current_width}, 目标宽度: {target_length}, 需要填充空格数: {fill_count}\n")# 为原有内容添加实线下划线for run in paragraph.runs:run.font.underline = True # 设置为单实线# 仅在最后添加全角空格并带下划线if extra_length > 0:# 清除原有换行符(如果有)if paragraph.runs and paragraph.runs[-1].text.endswith('\n'):paragraph.runs[-1].text = paragraph.runs[-1].text.rstrip('\n')# 获取最后一个 run 的字体格式last_run = paragraph.runs[-1] if paragraph.runs else None# 添加空格,并复制原有格式fill_run = paragraph.add_run(" " * extra_length)if last_run: # 如果存在原有 run,则复制其字体格式fill_run.font.name = last_run.font.name # 字体fill_run.font.size = last_run.font.size # 字号fill_run.font.bold = last_run.font.bold # 加粗fill_run.font.italic = last_run.font.italic # 斜体fill_run.font.underline = True # 设置下划线# 恢复原有换行符(如果有)if len(lines) > 1:paragraph.add_run().add_break()# 保存文档doc.save(output_path)# 使用示例
path = r'C:\Users\jg2yXRZ\OneDrive\桌面\工具运用'
input_path = path + r'\附件1工具运用训会议记录(2025.4.23).docx'
output_path = path + r'\附件1工具运用训会议记录(2025.4.23)_动态下划线.docx'
add_dynamic_underline(input_path, output_path)
测试效果
删除空行,然后把内容变成10-1000字的段落
ok,完美实现补全下划线的目标。
后续做成exe,GUI界面,选择文件夹,发给不同的课题组成员补会议记录用(贴完文字后,用Python自动添加一下每行最后空白的下划线)让做的资料的文本版式更好看,
相关文章:

【办公类-89-02】20250424会议记录模版WORD自动添加空格补全下划线
背景需求 4月23日听了一个MJB的征文培训,需要写会议记录 把资料黏贴到模版后,发现每行需要有画满下划线 原来做这套资料,就是手动按空格到一行末,有空格才会出现下划线,也就是要按很多的空格(凑满一行&…...

解释器模式:自定义语言解析与执行的设计模式
解释器模式:自定义语言解析与执行的设计模式 一、模式核心:定义语言文法并实现解释器处理句子 在软件开发中,当需要处理特定领域的语言(如数学表达式、正则表达式、自定义配置语言)时,可以通过解释器模式…...
了解互联网
本文来源 : 腾讯元宝 克劳德香农(Claude Shannon) 信息时代之父 克劳德香农(Claude Shannon,1916-2001)是20世纪最具影响力的数学家和工程师之一,被誉为“信息论之父”和“数字…...
Vue和React项目中,统一监听页面错误需要结合框架提供的错误处理机制与JavaScript原生方法
在Vue和React项目中,统一监听页面错误需要结合框架提供的错误处理机制与JavaScript原生方法,以下是具体方案及实现原理: Vue项目统一监听错误 errorCaptured生命周期钩子134 作用:监听所有下级组件的报错,可返回fals…...

AI催生DLP新战场 | 天空卫士连续6年入选Gartner 全球数据防泄漏(DLP)市场指南
“管理数据外泄风险仍然是企业的重大挑战之一,客户处出于各种因素寻求DLP。最近,一些组织对使用DLP控制机器对敏感信息的访问表现出很大兴趣。 随着生成式人工智能(GenAI)的运用和数据的不断扩散,数据外泄的问题变得更…...
23种设计模式-行为型模式之策略模式(Java版本)
Java 策略模式(Strategy Pattern)详解 🧠 什么是策略模式? 策略模式是一种行为型设计模式,它定义了一系列算法,把它们一个个封装起来,并且使它们可以互相替换。策略模式让算法独立于使用它的客…...

Adobe After Effects的插件--------Optical Flares之Lens Objects参数
Lens Objects,即【镜头对象】。 通用设置 全局参数发光多光圈光圈条纹微光反射钉球闪光圆环箍焦散镜头球缩放✔✔✔✔✔✔✔✔✔✔✔✔✔缩放偏移✔长宽比✔✔✔✔✔✔✔✔✔✔✔✔✔混合模式✔颜色✔全局种子✔亮度✔✔✔✔✔✔✔✔✔✔✔✔拉伸✔✔✔✔✔✔✔✔✔✔✔✔距离…...
使用Matlab工具将RAW文件转化为TXT文件,用于FPGA仿真输入
FPGA实现图像处理算法时,通常需要将图像作为TestBench的数据输入。 使用VHDL编写TestBench时,只能读取二进制TXT文件。 现在提供代码,用于实现RAW图像读取,图像显示,图像转化为二进制数据并存入TXT文件中。 clc; cl…...

【问题】解决docker的方式安装n8n,找不到docker.n8n.io/n8nio/n8n:latest镜像的问题
问题概览 用docker方式安装n8n,遇到错误,安装不了的问题: Unable to find image docker.n8n.io/n8nio/n8n:latest locally docker: Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request can…...
【网络】TCP/IP协议学习
学TCP/IP最好的方法是阅读lwip源码。 1. 资料 什么是SYN Flood?DoS 和 DDoS 攻击,一个字母之差,到底区别在哪? 2. 技术要点: 技术要点要结合源码,以及向AI提问来理解,否则真的很难理解&…...

系统与网络安全------弹性交换网络(1)
资料整理于网络资料、书本资料、AI,仅供个人学习参考。 Trunk原理与配置 Trunk原理概述 Trunk(虚拟局域网中继技术)是指能让连接在不同交换机上的相同VLAN中的主机互通。 VLAN内通信 实现跨交换的同VLAN通信,通过Trunk链路&am…...

10天学会嵌入式技术之51单片机-day-3
第九章 独立按键 按键的作用相当于一个开关,按下时接通(或断开),松开后断开(或接通)。实物图、原理图、封装 9.2 需求描述 通过 SW1、SW2、SW3、SW4 四个独立按键分别控制 LED1、LED2、LED3、LED4 的亮…...

深入解析微软MarkitDown:原理、应用与二次开发指南
一、项目背景与技术定位 微软开源的MarkitDown并非简单的又一个Markdown解析器,而是针对现代文档处理需求设计的工具链核心组件。该项目诞生于微软内部大规模文档系统的开发实践,旨在解决以下技术痛点: 大规模文档处理性能:能够高…...

【PVCodeNet】《Palm Vein Recognition Network Combining Transformer and CNN》
[1]吴凯,沈文忠,贾丁丁,等.融合Transformer和CNN的手掌静脉识别网络[J].计算机工程与应用,2023,59(24):98-109. 文章目录 1、Background and Motivation2、Related Work3、Advantages / Contributions4、Method5、Experiments5.1、Datasets and Metrics5.2、Hyper-parameters5.…...
CentOS 7 磁盘分区详细教程
CentOS 7 磁盘分区详细教程 在服务器管理和运维过程中,磁盘分区是一项基础且重要的操作。合理的磁盘分区可以提高数据存储的安全性、高效性,方便系统管理与维护。本文将详细介绍在 CentOS 7 系统中进行磁盘分区的具体步骤和方法。 一、准备工作 1.1 确…...
从青涩到 AI:我与评估程序的三十年 “纠缠” 与重启(参数化)
接上篇:从青涩到 AI:我与评估程序的三十年 “纠缠” 与重启 主要对参数配置和模板文件处理进行了改动,将可参数化的数据放到了config.yaml文件中,再一个将模板文件(评估模板.xlsx)分离为(7年级模板.xls…...

x-cmd install | brows - 终端里的 GitHub Releases 浏览器,告别繁琐下载!
目录 核心功能与优势安装适用场景 还在为寻找 GitHub 项目的特定 Release 版本而苦恼吗?还在网页上翻来覆去地查找下载链接吗?现在,有了 brows,一切都将变得简单高效! brows 是一款专为终端设计的 GitHub Releases 浏览…...
【python】如何将文件夹及其子文件夹下的所有word文件汇总导出到一个excel文件里?
根据你的需求,这里提供一套完整的Python解决方案,支持递归遍历子文件夹、提取Word文档内容(段落+表格),并整合到Excel中。以下是代码实现及详细说明: 一个单元格一个word的全部内容 完整代码 # -*- coding: utf-8 -*- import os from docx import Document import pand…...
C++ 封装成DLL,C#调用
目录 前言 一、C DLL 封装 二、C# 调用 DLL 1、创建 C# 控制台项目,调用 三、注意事项 前言 在实际工程开发中,跨语言调用是常见的需求,尤其是在性能要求较高的模块中,常常采用 C 实现核心算法逻辑,并通过封装为 D…...

多模态知识图谱:重构大模型RAG效能新边界
当前企业级RAG(Retrieval-Augmented Generation)系统在非结构化数据处理中面临四大核心问题: 数据孤岛效应:异构数据源(文档/表格/图像/视频)独立存储,缺乏跨模态语义关联,导致知识检…...

实验八 版本控制
实验八 版本控制 一、实验目的 掌握Git基本命令的使用。 二、实验内容 1.理解版本控制工具的意义。 2.安装Windows和Linux下的git工具。 3.利用git bash结合常用Linux命令管理文件和目录。 4.利用git创建本地仓库并进行简单的版本控制实验。 三、主要实验步骤 1.下载并安…...
微服务相比传统服务的优势
这是一道面试题,咱们先来分析这道题考察的是什么。 如果分析面试官主要考察以下几个方面: 技术理解深度 你是否清楚微服务架构(Microservices)和传统单体架构(Monolithic)的本质区别。能否从设计理念、技术…...

JavaWeb:Web介绍
Web开篇 什么是web? Web网站工作流程 网站开发模式 Web前端开发 初识web Web标准 HtmlCss 什么是Html? 什么是CSS?...

教育行业网络安全:守护学校终端安全,筑牢教育行业网络安全防线!
教育行业面临的终端安全问题日益突出,主要源于教育信息化进程的加速、终端设备多样化以及网络环境的开放性。 以下是教育行业终端安全面临的主要挑战: 1、设备类型复杂化 问题:教育机构使用的终端设备包括PC、服务器等,操作系统…...
【论文速递】2025年04周 (Robotics/Embodied AI/LLM)
目录 DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning摘要 Evolving Deeper LLM Thinking摘要 Kimi k1.5: Scaling Reinforcement Learning with LLMs摘要 Agent-R: Training Language Model Agents to Reflect via Iterative Self-Train…...

Spring Boot知识点详解
打包部署 <!‐‐ 这个插件,可以将应用打包成一个可执行的jar包;‐‐> <build><plugins> <plugin> <groupId>org.springframework.boot</groupId><artifactId>spring‐boot‐maven‐plugin</artifactId&g…...
LangChain与图数据库Neo4j LLMGraphTransformer融合:医疗辅助诊断、金融风控领域垂直领域、法律咨询场景问答系统的技术实践
LangChain与图数据库融合:垂直领域问答系统的技术实践 一、技术背景与核心价值 在垂直领域(如金融、医疗、法律)的问答场景中,传统RAG系统常面临实体关系推理不足和专业术语理解偏差的痛点。LangChain通过集成图数据库与知识图谱…...

DNS主从同步及解析
DNS 域名解析原理 域名系统的层次结构 :DNS 采用分层树状结构,顶级域名(如.com、.org、.net 等)位于顶层,下面是二级域名、三级域名等。例如,在域名 “www.example.com” 中,“com” 是顶级域名…...

在Windows11上用wsl配置docker register 镜像地址
一、下载软件 1、下载wsl:安装 WSL | Microsoft Learn,先按照旧版 WSL 的手动安装步骤 | Microsoft Learn的步骤走 注:如果wsl2怎么都安装不下来,可能是Hyper-V没有打开,打开控制面板->程序和功能->启用或关闭Windows功能,勾选Hyper-V 如果Windows功能里面没有Hyp…...
Spring—循环依赖与三级缓存
Spring中存在三级缓存: 第一层缓存(singletonObjects):单例对象缓存池,已经实例化并且属性赋值,这里的对象是成熟对象;第二层缓存(earlySingletonObjects):单…...