开发者

学习win32com操作word之Range精讲

目录
  • 引言
  • Range是什么
  • Range的作用
  • Range声明范围的三种形式
    • 使用Range声明文档全选
    • 使用MJIaQcStSeRange声明选择某范围资源
    • 使用Range声明一个无内容的范围:插入点
  • Range.Text属性
    • Range.Start & Range.End 属性
      • 更改Range的范围
        • MoveStart & MoveEnd方法
          • 使用Range写入文本
            • Range.Text重新赋值实现插入
            • InsertBefore和InsertAfter方法插入
          • 插入段落标记
            • InertParagraph
            • InsertParagraphBefore
            • InsertParagraphAfter
          • 最后

            引言

            本集开始,将会深入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()
            

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

            学习win32com操作word之Range精讲

            使用Range声明文档全选

            rng1 = doc.Range()
            

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

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

            用法 Range(Start:开发者_JS学习 int, End: int) -> Range

            StartEnd表示字符,表示选择了从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来获得范围的结束位置啦。

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

            更改Range的范围

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

            MoveSandroidtart & 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:在范围的结束位置插入内容

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

            学习win32com操作word之Range精讲

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

            插入段落标记

            另起一段是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接口就能讲很多集。学习不能急,但也不能懒,代码敲起来,没有学不会的内容。

            以上就是学习win32com操作word之Range精讲的详细内容,更多关于Range win32com操作word的资料请关注我们其它相关文章!

            0

            上一篇:

            下一篇:

            精彩评论

            暂无评论...
            验证码 换一张
            取 消

            最新开发

            开发排行榜