学习win32com操作word之Range精讲
作者:一灯编程 发布时间:2021-05-13 11:36:58
引言
本集开始,将会深入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()
此时,客户端上已经创建了一个新文档,为了方便演示,先在文档中粘贴一段新闻:
使用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
接口就能讲很多集。学习不能急,但也不能懒,代码敲起来,没有学不会的内容。
来源:https://juejin.cn/post/7189866353514577979


猜你喜欢
- # 贪婪模式 默认的匹配规则# 在满足条件的情况下 尽可能多的去匹配到字符串import rers = re.match('\d{6
- 直接使用==比较的情况分类说明是否能比较说明基本类型整型( int/uint/int8/uint8/int16/uint16/int32/u
- Python可以使用 xml.etree.ElementTree 模块从简单的XML文档中提取数据。 为了演示,假设你想解析Planet P
- 问题:如何在报表中每隔N行显示一条粗线如何为报表增加一个行号列?回答:1、在设计模式里打开该报表,在报表主体里面加一个TextBox,把Na
- 这不仅仅是一个信息 * 的时代,也是一个服务 * 的时代。一切都是因为互联网,随着互联网技术的发展,信息的增多,服务的增多,用户需求的多样化。怎
- 本文实例为大家分享了python实现图像边缘检测的具体代码,供大家参考,具体内容如下任务描述背景边缘检测是数字图像处理领域的一个常用技术,被
- 前言MySQL在2016年仍然保持强劲的数据库流行度增长趋势。越来越多的客户将自己的应用建立在MySQL数据库之上,甚至是从Oracle迁移
- 常见触发错误的情况如果传入的字段多了会自动过滤如果传入的少了会报错,必填字段如果传入的字段名称对不上也会报错如果传入的类型不对会自动转换如果
- 本文实例讲述了Python实现将数据写入netCDF4中的方法。分享给大家供大家参考,具体如下:nc文件为处理气象数据文件。用户可以去htt
- 前言:如何做到,控制多设备并行执行测试用例呢。思路篇我们去想下,我们可以获取参数的信息,和设备的信息,那么我们也可以针对每台设备开启不一样的
- 使用celery在django项目中实现异步发送短信在项目的目录下创建celery_tasks用于保存celery异步任务。在celery_
- 前言以下述环境为例:python=3.7pytorch=1.7.1torchvision==0.8.2cudatoolkit=10.1pyt
- 今天学习了小程序实现路由跳转,我在操作的时候在控制台出现以下错误信息。翻译过来的意思是:(承诺中)微程序错误{“errMsg”:“n”avi
- 本文实例讲述了python通过urllib2获取带有中文参数url内容的方法。分享给大家供大家参考。具体如下:对于中文的参数如果不进行编码的
- 用面向对象的思维解决问题的重点当遇到一个需求的时候不用自己去实现,如果自己一步步实现那就是面向过程;应该找一个专门做这个事的人来做。面向对象
- 一、什么是异常在python中,错误触发的异常如下二、异常的种类在python中不同的异常可以用不同的类型去标识,一个异常标识一种错误。1
- EXCEL数据上传到SQL SERVER中的方法需要注意到三点!注意点一:要把EXCEL数据上传到SQL SERVER中必须提前把EXCEL
- NicEdit的Javascript集成到任何网站在几秒钟内作出的任何元素/区块编辑或转换标准textareas来丰富文本编辑。 How t
- 呵呵,这几天沉溺于灌水,发现转贴的时候真的是很不方便,文字、图形、颜色、连接,如果都转过来真的是满费劲的,于是就写了一个小东西,简陋的很,不
- 看了大神统计voc数据集标签框后,针对自己标注数据集,灵活应用 ,感谢!看代码吧~import reimport osimport xml.