【Python】Word文档操作

news/2024/11/19 1:54:44/文章来源:https://www.cnblogs.com/mindzone/p/18291962

 

一、全文替换

不是创建word文档写入内容,而是基于现有的Word文档进行替换处理

使用run.text直接赋值修改发现样式会丢失,而网上大部分办法都是这么写的...

直到我看到这篇文章的评论:

https://blog.csdn.net/qq_40222956/article/details/106098464

 

除了段落替换后,Word文档还插入了表格,后来反应过来表格的单元格也是有段落属性

同样需要通过段落对象拿到run进行替换

 

直接上代码:

# 全文替换操作,且不丢失文档样式
def replace_text_in_doc(doc: Document):# 段落内容替换for para in doc.paragraphs:for idx, run in enumerate(para.runs):para_text = run.text.strip()if not para_text:continuemodified_text = mustache_clear(para_text)para.runs[idx].text = modified_text# 单元格内容替换for table in doc.tables:for row in table.rows:for cell in row.cells:for cell_para in cell.paragraphs:for idx, cp_run in enumerate(cell_para.runs):cpr_text = cp_run.text.strip()if not cpr_text:continuemodified_text = mustache_clear(cpr_text)cell_para.runs[idx].text = modified_textdoc.save(new_doc_path)return

  

二、读取文档标题:

发现文档标题有好几种style名称

# 标准标题style类型名
headerTags = ['Heading 1','Heading 2','Heading 3','Heading 4','Heading 5','Heading 6',
]# 目录style类型名
tocTypes = ['toc 1','toc 2','toc 3','toc 4','toc 5''toc 6'
]# 附录自定义style类型名
customHeaders = ['附录一级标题','附录二级标题','附录三级标题','附录四级标题','附录五级标题',
] 

但是toc类型的是最多最全的,这里就用toc来找标题了

 

代码实现:

通过toc读取的段落,除了文本本身还会附带标题下标

所以这里还做了下标拆分和保留的逻辑

# 目录style类型名
tocTypes = ['toc 1','toc 2','toc 3','toc 4','toc 5''toc 6'
]# 读取所有目录信息
def get_all_toc_title_text(doc: Document):print('- - - - - - 读取所有目录信息 - - - - - - ')toc_list = []for para in doc.paragraphs:if para.style.name in tocTypes:rough_collect = para.text.split()# 标题信息title = ' '.join(rough_collect[: -1])# 标题下标title_idx = rough_collect[-1]toc_list.append(title)print(f"{title} | {title_idx}")return toc_list

  

三、读取文档表格:

表格读取没有过多要声明的

# 读取所有表格
def get_all_tables(doc: Document):print('- - - - - - 读取所有表格 - - - - - - ')for table in doc.tables:print('- - - - - - table - - - - - - ')for row in table.rows:for cell in row.cells:print(f"{cell.text} | ", end='')print()return

  

但是读取指定部分的表格就有点费劲了

表格的话这里只有下标可以访问第几个表格,所以只能从表格内容为特征入手

例如附录D的表格头的列信息固定是这几个文本:

appendix_d_spec = {'安全控制点', '测评指标', '结果记录', '符合程度'}

docx读取的时候,顺序会不一致,所以用集合装填元素,只要取出的集合和特征集合元素一样即可

逻辑代码:

# 读取所有附录D的表格数据
def get_appendix_d_tables(doc: Document):print('- - - - - - 读取所有附录D的表格数据 - - - - - - ')for table in doc.tables:first_row = table.rows[0].cellscol_len = len(first_row)cell_name_list = {cell.text for cell in first_row}print(cell_name_list)if len(cell_name_list) != 4:continuecell_name = ' | '.join(cell_name_list)print(f"cell_name -> {cell_name}, col_len -> {col_len} ")if appendix_d_spec != cell_name_list:continueprint('- - - - - - 附录D表格开始 - - - - - - ')for row in table.rows:each_row = " | ".join({cell.text for cell in row.cells})print(each_row)print('- - - - - - 附录D表格结束 - - - - - - ')return

  

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/741165.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【ubuntu】安装go

一、官网 https://golang.google.cn/dl/ 选择稳定版本,点击下载二、安装步骤 1、解压2、移动目录sudo mv go /usr/local3、配置环境变量 vim ~/.bashrcexport PATH=$PATH:/usr/local/go/bin export GOPATH=$HOME/gocode创建gocode目录 vim ~/.profile 添加同样配置三、验证$ g…

2024迎新马拉松——字典

思路 这道题可以把每个单词正过来放在一个字典树里。 把每个单词反过来,给每个单词单独建立一个字典树。 而询问要求的就是前缀在正串的字典树上的那个节点为根的子树中,所有串的反串字典树合并之后的那个字典树上,后缀的那个节点所对应的子树当中有多少个串就是答案。 举个…

win11系统 连接共享打印机提示 0x0000709

windows11 用户在添加共享打印机的时候,遇到了系统错误提示:操作无法完成(错误0x0000709) 其他查考文章: https://baijiahao.baidu.com/s?id=1788757659395932042&wfr=spider&for=pc

24迎新马拉松——字典

思路 这道题我们可以把每个单词正过来放在一个字典树里。 而我们把每个单词反过来,给每个单词单独建立一个字典树。 而询问要求的就是前缀在正串的字典树上的那个节点为根的子树中,所有串的反串字典树合并之后的那个字典树上,后缀的那个节点所对应的子树当中有多少个串就是答…

香橙派5plus上跑云手机方案二 waydroid

前言 上篇文章香橙派5plus上跑云手机方案一 redroid(带硬件加速)说了怎么跑带GPU加速的redroid方案,这篇说下怎么在香橙派下使用Waydroid。 温馨提示 虽然能运行,但是体验下来只能用软件加速,无法使用GPU加速,所有会很卡。而且Waydroid还依赖于桌面环境wayland,要么插上显…

弹性伸缩落地实践

1. 什么是 HPA ? HPA(Horizontal Pod Autoscaler)是 Kubernetes 中的一种资源自动伸缩机制,用于根据某些指标动态调整 Pod 的副本数量。 2. 什么时候需要 HPA ?负载波动:当您的应用程序的负载经常发生波动时,HPA 可以自动调整 Pod 的副本数量,以适应负载的变化。例如,…

三星 NAND FLASH命名规范 Samsung NAND Flash Code Information

一共有三页,介绍了前面主要的编号和横杠后面的编号,当前文档只关注前面的编号。 从前面的命名规范中可以得知当前芯片的容量、技术等概要信息,对芯片有一个整体了解。 详细解释 Small Classification 表示存储单元的类型和应用,比如 SLC 1 Chip XD Card 表示是SLC的,包含1…

[转]ZeroMQ用法说明及C++示例

原文链接:https://blog.csdn.net/qq_40344790/article/details/130865273ZMQ介绍 官网:https://zeromq.org/ Github:https://github.com/zeromq/libzmq ZMQ(ZeroMQ)是一种高性能的异步消息传递库,它可以在不同的进程和机器之间进行消息传递。它提供了多种传输协议、通信模…

Solidity:assembly

在Solidity中,assembly是一个内嵌的低级语言,它允许开发者直接编写EVM(以太坊虚拟机)字节码。这种能力使得开发者可以更精细地控制智能合约的行为,并且在某些情况下可以提高性能和减少gas费用。然而,使用assembly也增加了代码的复杂性和出错的可能性,因此应谨慎使用。 为…

K8s 驱逐场景以及规避方案

Pod 驱逐场景总结从一个 SRE 角度看, Pod 驱逐分为两种情况:较安全驱逐 & 提高稳定性的良性驱逐API 发起驱逐,典型案例:kubectl drain Node Not Ready 时,Controller Manager 发起的驱逐有风险的驱逐节点压力驱逐节点磁盘空间不足、内存不足 或 Pid 不足, kubelet 发…

[二、状态管理]1状态管理概述

在前文的描述中,我们构建的页面多为静态界面。如果希望构建一个动态的、有交互的界面,就需要引入“状态”的概念。 图1 效果图上面的示例中,用户与应用程序的交互触发了文本状态变更,状态变更引起了UI渲染,UI从“Hello World”变更为“Hello ArkUI”。 在声明式UI编程框架…

lazarus 项目用到的控件

官网 https://www.lazarus-ide.org/ 基本上都是原生插件,能同时满足WINDOWS和Linux下开发 用到的控件