本课程《win32com操作word API精讲&项目实战》,本公众号以文字分享为主,B站与视频号则发布视频分享,ID均为:一灯编程

本集开始,将会深入Document接口。打开或创建一个文档都会产生一个Document对象,它代表文档本身,所以绝大部分文档的操作都会依赖该接口,它的属性和方法共计374个!说不上很多,但它大部分的接口和属性都是一个个独立接口封装而成的。

但不必担忧,官方的文档中显示,有一部分接口是用于客户端级编程的,我们只需要学习部分接口足以满足各种类型的文档级开发需求了。

Range是什么

这是本节课要讲的接口,它是Document的方法,但其本身也是一个独立的接口,方法和属性共计183个。Range这个接口简直是word接口中的劳模。它表示资源选中或插入点,可以理解为一个看不见的鼠标,但它比鼠标的作用强大多了。官方也提供了Selection接口,这是正儿八经的鼠标,它能和鼠标交互,个人认为Selection适合用在客户端级开发的场景,文档级开发的场景还是Range好用。

Range的作用

操作文档中的资源,如选中一段文字,在实操中,得先鼠标选中文字。在word编程中,使用Range就能实现资源的选中,Selection是单例模式,Range可不是,最近的一个Range实例不会覆盖前面的实例,每个实例都是独立存在的。

Range声明范围的三种形式

from win32com.client import Dispatch

client = Dispatch('word.Application')
client.Visible = 1 # 创建一个文档 返回一个Document对象 操作文档就必须要操作Document
doc = client.Documents.Add()

此时,客户端上已经创建了一个新文档,为了方便演示,先在文档中粘贴一段新闻:

总部大楼内唯一对外开放的部分,是著名的火器博物馆。它共有15个展室,收藏着3000件曾经叱咤美国各个历史时期的著名枪械和部分外国名枪。其中,“前总统收藏专区”更是显示出这一协会与美国政界的紧密联系。在美国历史上,有九位总统曾是该协会的会员,分别是:格兰特、西奥多·罗斯福、塔夫脱、艾森豪威尔、肯尼迪、尼克松、里根、老布什。还有一位,就是上任总统特朗普。要让这么多总统站台,背后往来的金钱可不是小数目。数据显示,美国全国步枪协会在2016年总统选举中捐出的竞选资金高达5440万美元,其中,他们为特朗普砸下了3000万美元。

使用Range声明文档全选

rng1 = doc.Range()

没什么可讲的,真的太简单了,如果你刚接触Python不久且无其他编程语言基础,只需要记住,Range接口返回一个Range对象,表示当前被选中的内容,仅此。

使用Range声明选择某范围资源

用法 Range(Start: int, End: int) -> Range

Start和End表示字符,表示选择了从Start开始,截至End的范围。

rng2 = doc.Range(0,10)

使用Range声明一个无内容的范围:插入点

rng3 = doc.Range(20,20)

当起始位置和结束位置一样时,Range中就无内容了,它是一个点,这种插入点通常用来往插入点写入内容。这样做很方便,不必担心因为误操作而导致范围中的内容被替换。

Range.Text属性

Text属性内部有__setter__,可以使用该属性来获取或设置范围中的内容。打印Range实例时,会返回一个<COMObject Range>,看不到实例细节,此时可以使用Text属性查看范围中的文本。

使用Text属性获取范围中的内容

rng2 = doc.Range(0,4)
print(rng2.Text)
>>>
'总部大楼'

Range.Start & Range.End 属性

两个属性分别可以获取或设置范围的起始位置和结束位置,在实操中,有时候Range的范围并不是通过Range(Start, End)这种方式来声明的,而是某种方式,比如使用Document.Paragraphs(1)获得文章第一段,而某些操作只能在Range对象下才能操作,那么可以使用,Document.Paragraphs(1).Range将第一段的段落对象转换成了Range对象,此时就可以通过Range.End来获得范围的结束位置啦。

当然,这两个属性也是实现了__setter__方法的,意味着可以通过为属性赋值来改变Range的范围。

更改Range的范围

在word编程中,更改Range范围是常规操作,上面的Start和End属性可以实现,但复杂的需求和编程环境是不允许我们来数数有几个字符的,这不现实。所以,微软官方提供了非常丰富的接口来实现Range范围的更改,比如,下面要讲的MoveStart和MoveEnd方法。

MoveStart & MoveEnd方法

1、MoveStart(Unit=1, Count=1)

该方法可以改变范围的起始位置,可以扩大范围也可以减少范围,参数说明:

  • Unit:

    按什么单位移动,1表示字符,3表示句子,4表示段落,
  • Count:

    执行一次要移动多少个Unit,正数表示往前移动(文档结束的方向),负数表示往后移动(文档开头的方向)

2、MoveEnd(Unit=1, Count=1)

参数和MoveStart一模一样。

演示

rng3 = doc.Range(0,4)
rng3.MoveStart(Unit=4, Count=1)
print(rng3.Start, rng2.End)
# 移动后打印起始位置和结束位置
>>>
(262, 262)

明明只移动了起始位置,但为何结束位置从原来的4也变成了262字符位置了呢?请看下方说明:

说明

无论是MoveStart还是MoveEnd,如果一方的位置超越了另一方,两个点就会重叠并形成插入点,最后一起移动到目标位置,不可能会出现结束位置小于起始位置这种匪夷所思的情况。

这种玩法就很妙,意味着,我们不需要在意到底要数到第几个字符就可以轻松获得一个Range的范围。

使用Range写入文本

Range.Text重新赋值实现插入

前面所示,可以使用Range.Text属性重新赋值,这很简单,就演示个伪代码吧。

# 伪代码
# 在0,0的位置声明一个插入点
rng1 = doc.Range(0,0)
# 使用Text属性插入内容
rng1.Text = '一灯编程'

注意:

除非你想替换范围中的内容,否则不要轻易使用有内容的范围来执行doc.Range(0,10).Text = '插入的内容'语句。

InsertBefore和InsertAfter方法插入

InsertBefore:在范围的起始位置插入内容

InsertAfter:在范围的结束位置插入内容

这两个方法是为有内容的范围量身订造的,我想,千言万语不如一张图来得直接(懒)。

注意:两个方法会扩大原来的范围

插入段落标记

另起一段是word编辑中常用的功能,使用回车即可实现,在word编程中,有三个方法可以实现的。

InertParagraph

使用段落标记\r替换原来范围中的内容,并形成新段落。

rng4 = doc.Range(20,20)
rng4.InsertParagraph()

该方法适用于插入点,因为它会使用自动执行以下代码:

rng4.Text = '\r'

意味着,\r会替换原来范围中的内容,除非有这个必要。执行这个方法后,从字符21开始,后面的内容都会另起一段。

InsertParagraphBefore

在范围起始位置插入一个段落标记\r,意思是在原来内容的基础上,在起始位置插入一个\r,那么当前范围会形成一个新段落,假如原来的内容为一灯编程,执行该方法后,内容为\r一灯编程。

rng5 = doc.Range(4,8)
rng5.InsertParagraphBefore()
print(rng5.Text)
>>>
"\r一灯编程"

InsertParagraphAfter

和InsertParagraphBefore相反,它会在结束位置插入\r,作用完全一样,不作演示。

最后

Document需要讲的内容很多,仅Range接口就能讲很多集。学习不能急,但也不能懒,代码敲起来,没有学不会的内容。

好啦,我们下节课接着讲Range。

win32com操作word 第三集:Range精讲(一)的更多相关文章

  1. win32com操作word(2):常用用法

    一.对象的位置关系: 1.Range属性位于(部分): Selection__Section__Cell__Paragraph__Table__Bookmark__Comment__Row__List ...

  2. win32com操作word(1):几个重要的对象(28.35)

    Pywin32模块为python封装了操作windows底层API函数的功能.而win32com是Pywin32下面的一个模块,专门负责操作com组件. 由于office工具(Word.Excel等) ...

  3. win32com操作word(3):导入VBA常量

    导入VBA常量方法:http://blog.sina.com.cn/s/blog_a73687bc0101k8x8.html 我们之前说过,win32com组件为python提供处理COM组件(.dl ...

  4. java架构之路-(微服务专题)nacos集群精讲实战

    上次回顾: 上次博客,我们主要说了微服务的发展历程和nacos集群单机的搭建,单机需要-m standalone启动,集群建议使用nginx做一下反向代理,自行保证mysql和ngxin的高可用. 本 ...

  5. range精讲

    var ec = range.endContainer endContainer不是一个引用类型 range是引用类型 range经过改变范围之后 var ec2 =range.endContaine ...

  6. 第三百五十节,Python分布式爬虫打造搜索引擎Scrapy精讲—selenium模块是一个python操作浏览器软件的一个模块,可以实现js动态网页请求

    第三百五十节,Python分布式爬虫打造搜索引擎Scrapy精讲—selenium模块是一个python操作浏览器软件的一个模块,可以实现js动态网页请求 selenium模块 selenium模块为 ...

  7. 第三百六十二节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)基本的索引和文档CRUD操作、增、删、改、查

    第三百六十二节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)基本的索引和文档CRUD操作.增.删.改.查 elasticsearch(搜索引擎)基本的索引 ...

  8. 第三百五十一节,Python分布式爬虫打造搜索引擎Scrapy精讲—将selenium操作谷歌浏览器集成到scrapy中

    第三百五十一节,Python分布式爬虫打造搜索引擎Scrapy精讲—将selenium操作谷歌浏览器集成到scrapy中 1.爬虫文件 dispatcher.connect()信号分发器,第一个参数信 ...

  9. Java 操作Word书签(三):用文本、图片、表格替换书签

    本篇文章将继续介绍通过Java来操作Word书签的方法,即替换Word中已有书签,包括用新的文本.图片.表格等替换原有书签处的内容. 使用工具:Free Spire.Doc for Java (免费版 ...

  10. python操作word(改课文格式)【最终版】

    python操作word的一些方法,前面写了一些感悟,有点跑题,改了下题目,方便能搜索到.心急的可以直接拉到最后看代码,我都加了比较详细的注释. 从8.3号早上9点,到8.8号下午5点半下班,终于把这 ...

随机推荐

  1. 小米MIUI禁止系统更新

    删除downloaded_rom的文件夹,随便找一个文件(文件,不是文件夹),重名为downloaded_rom(是把一个文件重命名),这样系统后台偷偷下载时,就不知道该存放更新包的文件,就无法偷偷更 ...

  2. Spring boot pom 配置文件

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...

  3. Python基础之模块:4、正则表达式和re模块

    目录 一.正则表达式 1.正则表达式前戏 2.字符组 3.特殊符号 4.量词 5.贪婪匹配与非贪婪匹配 6.转义符 7.正则表达式实战 二.re模块 1.模块导入 2.常见操作方法 1.findall ...

  4. 华为开发者大会2022:HMS Core 3D建模服务再升级,万物皆可驱动

    11月4日,HDC2022华为开发者大会在东莞松山湖举办.在本次大会的HMS Core创新图形能力分论坛中,HMS Core重点介绍了其在3D技术领域的创新应用方向,其中3D建模服务展示了创新的自动骨 ...

  5. 最长不下降子序列(线段树优化dp)

    最长不下降子序列 题目大意: 给定一个长度为 N 的整数序列:A\(_{1}\),A\(_{2}\),⋅⋅⋅,A\(_{N}\). 现在你有一次机会,将其中连续的 K 个数修改成任意一个相同值. 请你 ...

  6. java学习之爬虫

    0x00前言 对比与Python的爬虫机制和java的爬虫机制来详解一下java的爬虫,对于一般性的需求无论java还是python都可以胜任. 如需要模拟登陆.对抗防采集选择python更方便些,如 ...

  7. vue3 结合 element-plus 框架实现增删改查功能(不连接数据库)

    一.效果图 二.代码 2.1.导入依赖(已经安装过node.js) npm install element-plus --save 注意:要是安装失败,可以使用淘宝镜像进行下载,如下: 2.2.设置淘 ...

  8. salesforce零基础学习(一百二十一)Limitation篇之Heap Size Limitation

    本篇参考: https://help.salesforce.com/s/articleView?id=000384468&type=1 https://help.salesforce.com/ ...

  9. CodeGeeX:vscode中全新的智能代码补全插件

    大家好我是费老师,代码智能补全是近几年非常热门的话题,有前不久宣告项目终结的kite,反响平平的tabnine,以及最近吃了一堆官司的copilot. 而广大从事编程工作的用户只关心市面上的代码智能补 ...

  10. 这可能是最全的SpringBoot3新版本变化了!

    11月24号,Spring Boot 3.0 发布了第一个正式的 GA 版本,一起看看新版本到底有哪些变化. 2.7版本升级指南 官方提供了一个从 2.7 版本升级到 3.0 的指南:https:// ...