学习win32com操作word之Range精讲

目录
  • 引言
  • Range是什么
  • Range的作用
  • Range声明范围的三种形式
    • 使用Range声明文档全选
    • 使用Range声明选择某范围资源
    • 使用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()

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

使用Range声明文档全选

rng1 = doc.Range()

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

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

用法 Range(Start: 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来获得范围的结束位置啦。

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

更改Range的范围

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

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

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

(0)

相关推荐

  • 自定义range sliders滑块实现元素拖动方法

    目录 1. 使用原生 range input 2. 创建自定义 range slider 监听 knob 把手的 mousedown 事件,记录当前鼠标的位置. 计算左侧滑条宽度 移除 document 元素上的监听事件 1. 使用原生 range input 这篇文章介绍两种创建 range slider 滑块的方法. 老样子,话不多说,先上菜. const knob = document.getElementById('knob'); // 左边的滑条 const leftSide = kn

  • pytorch算子torch.arange在CPU GPU NPU中支持数据类型格式

    目录 正文 一. torch.arange() 和 torch.range() 的用法 二. torch.arange 支持的数据类型格式 正文 CPU(Central Processing Unit):中央处理器 GPU(Graphics Processing Unit):图形处理器 NPU(Neural Network Processing Unit):神经网络处理器,是基于神经网络算法与加速的新型处理器总称. 一. torch.arange() 和 torch.range() 的用法 py

  • Python中range函数的使用方法

    目录 1.range()函数是什么? 2.语法格式 3.报错问题 4.range()函数需要注意的 5.range对象是不可变序列 6.range函数实现逆序遍历 7.与列表list的使用 8.关于range函数小结 前言: 本篇基于Python3环境,Python2环境下的range会有所不同,但并不影响我们使用. 1.range()函数是什么? range()函数是python的内置函数,它能返回一系列连续添加的整数,能够生成一个列表对象. 大多数时常出如今for循环中,在for循环中可做为

  • Go语言结构体Go range的学习教程

    目录 正文 Go Range 正文 在前一篇博客我们学习了 Go 数组,其要求所有元素为同一数据类型,如果希望存储不同类型的数据,就要用到结构体相关知识. 结构体的定义:存储相同或不同类型的数据集合. 有 C 相关经验,结构体还是比较容易理解的,语法格式如下所示: type struct_variable_type struct { member definition member definition ... member definition } 上述语法格式的关键字是 struct 和 t

  • Selection与Range 对象操作示例指南

    目录 前言 Range 选择部分文本 选择dom元素节点 range对象属性 编辑范围的方法 Selection selection的属性 selection锚点和焦点与range开始结束点的区别 前言 有些时候我们需要能够通过JavaScript访问页面的当前选择,已达成选择(取消选择)部分节点以从文档中删除所选内容或像文档中插入某些新内容.我们需要Range和Selction对象已达成我们的目的. Range 选择的基本概念是Range,其本质是一对‘边界点’:范围起点和范围终点 我们可以通

  • Iptables防火墙iprange模块扩展匹配规则详解

    目录 Iptables防火墙iprange模块扩展匹配规则 案例: 1)编写防火墙规则 2)查看添加的规则 3)测试效果 Iptables防火墙iprange模块扩展匹配规则 iprange模块可以同时设置多个IP或者设置IP的某一段连续的范围,通过iprange模块可以对多个来源地址同时设置策略. iprange模块的参数: --src-range:指定源地址范围. --dst-range:指定目标地址范围. ! --src-range:非指定的源地址. ! --dst-range:非指定的目

  • Python中range函数的基本用法完全解读

    目录 前言 1.range() 是什么? 2. 为什么range()不生产迭代器? 3.range 类型是什么? 4.小结 附:Python的range()函数的历史 总结 前言 迭代器是 23 种设计模式中最常用的一种(之一),在 Python 中随处可见它的身影,我们经常用到它,但是却不一定意识到它的存在.在关于迭代器的系列文章中(链接见文末),我至少提到了 23 种生成迭代器的方法.有些方法是专门用于生成迭代器的,还有一些方法则是为了解决别的问题而“暗中”使用到迭代器. 在系统学习迭代器之

  • 学习win32com操作word之Range精讲

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

  • Python操作Word批量生成文章的方法

    下面通过COM让Python与Word建立连接实现Python操作Word批量生成文章,具体介绍请看下文: 需要做一些会议记录.总共有多少呢?五个地点x7个月份x每月4篇=140篇.虽然不很重要,但是140篇记录完全雷同也不好.大体看了一下,此类的记录大致分为四段.于是决定每段提供四种选项,每段从四选项里随机选一项,拼凑成四段文字,存成一个文件.而且要打印出来,所以准备生成一个140页的Word文档,每页一篇. 需要用到win32com模块(下载链接: http://sourceforge.ne

  • Python操作word常见方法示例【win32com与docx模块】

    本文实例讲述了Python操作word常见方法.分享给大家供大家参考,具体如下: 这里介绍两种方式: 使用win32com 使用docx 1. 使用win32com扩展包 只对windows平台有效 代码: # coding=utf-8 import win32com from win32com.client import Dispatch, DispatchEx word = Dispatch('Word.Application') # 打开word应用程序 # word = Dispatch

  • 剑指Offer之Java算法习题精讲字符串操作与数组及二叉搜索树

    题目一  解法 class Solution { public String reverseOnlyLetters(String s) { char[] chars = s.toCharArray(); int left = 0; int right = chars.length-1; while(left<=right){ char tmp = 0; if(chars[left]>='a'&&chars[left]<='z'||(chars[left]>='A'&

  • python实现在windows下操作word的方法

    本文实例讲述了python实现在windows下操作word的方法.分享给大家供大家参考.具体实现方法如下: import win32com from win32com.client import Dispatch, constants w = win32com.client.Dispatch('Word.Application') # 或者使用下面的方法,使用启动独立的进程: # w = win32com.client.DispatchEx('Word.Application') # 后台运行

  • java简单操作word实例

    本文为大家分享了java简单操作word例子,供大家参考,具体内容如下 package apache.poi; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; impor

  • C#操作word的方法示例

    本文实例讲述了C#操作word的方法.分享给大家供大家参考,具体如下: #region 读取word /// <summary> /// 读取word所有文字内容(不包含表格) /// </summary> /// <returns>word中的字符内容(纯文本)</returns> public string ReadAllFromWord() { Word.ApplicationClass app = null; Word.Document doc =

  • Redis缓存IO模型的演进教程示例精讲

    目录 前言 事件模型 通信 copy数据的开销 数据怎么知道发给哪个socket socket的数据怎么通知程序来取 Reactor IO多路复用器 select epoll epoll是怎么做到的? 单线程到多线程的演进 单线程 异步线程 多线程 多线程的作用点? 多线程的原理 前言 redis作为应用最广泛的nosql数据库之一,大大小小也经历过很多次升级.在4.0版本之前,单线程+IO多路复用使得redis的性能已经达到一个非常高的高度了.作者也说过,之所以设计成单线程是因为redis的瓶

  • C语言全面细致精讲关键字的使用

    目录 1.switch 深入理解 2.如何正确的使用 case 3.循环语句while for do while深度讲解 4.continue的作用是什么 5.goto真的没人用了吗 6.void 到底是何方妖怪 1.switch 深入理解 学习过C语言的小伙伴可能知道,switch 也是选择结构的一种,是具有判定能力的语法结构,那么他们都必须具备:判定+分支功能! 我们知道 if 可以搭配 else if 或 else 来实现分支功能,那么我们 switch 如何实现分支功能呢?这样,我们先来

  • powershell操作word详解

    powershell操作word 我假设许多读者用PowerShell生成服务器.事件以及Windows网络上各种数据的报表.您也许创建过纯文本文件,甚至漂亮的HTML报表.但是您也可以用上Microsoft Word,当然,前提是您已经安装了Word.在这个系列的第二部分,我将会向您演示如何用PowerShell为Word文档套用样式. 创建Word应用程序对象PowerShell可以通过COM接口控制Word应用程序.有趣的地方是,虽然您可以交互式地做所有的操作,但我希望您最终能够用脚本操作

随机推荐