单元格对象

单元格对象是工作表对象的子对象,使用单元格对象的属性和方法可以对它进行设置和修改。[大谦Excel,dqexcel点com]

【xlwings】

首先导入xlwings包:

code.python
>>> import xlwings as xw

用Book方法创建一个工作簿对象bk:

code.python
>>> bk=xw.Book()

新创建的工作簿中会自动添加一个名为"Sheet1"的工作表。获取该工作表,赋给变量sht。

code.python
>>> sht=bk.sheets(1)

默认时新添加的工作表即为活动工作表,所以也可以如下引用:

code.python
>>> sht= bk.sheets active
>>> sht.name
'Sheet1'

引用单元格

引用单元格,即找到单元格。这是进行后续操作的前提。下面分引用单个单元格、多个单元格、活动单元格、用名称引用和用变量引用等多种情况进行介绍。

一、引用单个单元格

使用工作表对象的Range(range, api.Range)和Cells(cells, api.Cells)属性引用单个单元格。使用xlwings方式,还可以用方括号进行引用。下面引用和选择工作表sht中的单元格A1:

【xlwings】

code.python
>>> sht.range("A1").select()
>>> sht.range(1,1).select()
>>> sht["A1"].select()
>>> sht.cells(1,1).select()
>>> sht.cells(1,"A").select()

【xlwings API】

code.python
>>> sht.api.Range("A1").Select()
>>> sht.api.Cells(1, "A").Select()
>>> sht.api.Cells(1,1).Select()

二、引用多个单元格

使用工作表对象的Range(range, api.Range)属性引用多个单元格,引用时,将各单元格坐标组成的字符串作为参数即可。使用xlwings方式,还可以用方括号进行引用。下面引用和选择工作表sht中的单元格B2, C5和D7:

【xlwings】

code.python
>>> st.range("B2, C5, D7").select()
>>> sht["B2, C5, D7"].select()

【xlwings API】

code.python
>>> sht.api.Range("B2, C5, D7").Select()

效果如图2-2所示。

Document Image

图2-2 引用和选择多个单元格

三、引用当前单元格

使用xlwings包来实现,首先获取所有Application对象的key值,用xlwings的apps属性,通过索引获取当前Application对象。然后给单元格C3赋值3.0,选择它,用API方法获取ActiveCell属性的值。选择一个单元格,它即成为活动单元格。

code.python
>>> pid=xw.apps.keys()
>>> app=xw.apps[pid[0]]
>>> sht["C3"].value=3.0
>>> sht["C3"].select()
>>> a=app.api.ActiveCell.Value
>>> a
3.0

四、用单元格的名称进行引用

如果单元格有名称,可以用它的名称进行引用。下面首先将单元格C3的名称设置为test,然后用该名称引用此单元格。

【xlwings】

code.python
>>> cl=sht.cells(3,3)
>>> cl.name="test"
>>> sht.range("test").select()

【xlwings API】

code.python
>>> cl=sht.api.Range("C3")
>>> cl.Name="test"
>>> sht.api.Range("test").Select()

五、用变量进行引用

在编程过程中,常常需要动态设置单元格的坐标,这就要用到变量。使用单元格对象的Range属性引用单元格时,可以将行号或列号的数字部分转换成字符串,然后组合成一个完整的坐标字符串进行引用。使用Cells属性时如果有必要也进行相应的处理,转换数据类型即可。下面用变量引用单元格C3。

【xlwings】

code.python
>>> i=3
>>> sht.range("C"+ str(i)).value
>>> sht.cells(i,i).value

【xlwings API】

code.python
>>> i=3
>>> sht.api.Range("C"+ str(i)).Value
>>> sht.api.Cells(i,i).Value

引用整行和整列

引用整行,在xlwings API使用方式下,可以使用工作表对象的Rows属性和Range属性实现。Rows属性有一个参数,指定要引用行的行号。使用Range属性时,可以将“行号:行号”形式的字符串作为参数进行引用;或引用该行上的任意一个单元格后接着引用其EntireRow属性获取整行。xlwings使用方式还可以使用中括号进行引用。下面引用和选择第一行:

【xlwings】

code.python
>>> sht.range("1:1").select()
>>> sht["1:1"].select()

【xlwings API】

code.python
>>> sht.api.Rows(1).Select()
>>> sht.api.Range("1:1").Select()
>>> sht.api.Range("A1").EntireRow.Select()

引用多行时,使用方法跟引用单行的类似,只是需要指定起始行和终止行的行号,中间用冒号隔开。使用EntireRow属性时,指定所在连续多行上占据所有行的任意区域即可。下面引用和选择工作表sht上的第1-5行:

【xlwings】

code.python
>>> sht.range("1:5").select()
>>> sht["1:5"].select()
>>> sht[0:5,:].select()

【xlwings API】

code.python
>>> sht.api.Rows("1:5").Select()
>>> sht.api.Range("1:5").Select()
>>> sht.api.Range("A1:C5").EntireRow.Select()

注意xlwings使用方式下sht[0:5,:]的引用方法,中括号中第2个冒号是切片的用法,表示逗号前面指定的连续多行的所有列。

引用整列,在xlwings API使用方式下,可以使用工作表对象的Columns属性和Range属性实现。Columns属性有一个参数,指定要引用列的列号,可以用数字或字母表示。使用Range属性时,可以将“列号:列号”形式的字符串作为参数进行引用;或引用该列上的任意一个单元格后接着引用其EntireColumn属性获取整列。下面引用和选择第一列:

【xlwings】

code.python
>>> sht.range("A:A").select()

【xlwings API】

code.python
>>> sht.api.Columns(1).Select()
>>> sht.api.Columns("A").Select()
>>> sht.api.Range("A:A").Select()
>>> sht.api.Range("A1").EntireColumn.Select()

引用多列时,使用方法跟引用单列的类似,只是需要指定起始列和终止列的列号,中间用冒号隔开。使用EntireColumn属性时,指定所在连续多列上占据所有列的任意区域。下面引用和选择工作表sht上的B-C列:

【xlwings】

code.python
>>> sht.range("B:C").select()
>>> sht[:,1:3].select()

【xlwings API】

code.python
>>> sht.api.Columns("B:C").Select()
>>> sht.api.Range("B:C").Select()
>>> sht.api.Range("B1:C2").EntireColumn.Select()

引用区域

区域,指的是连续引用行和列方向上的m×n个单元格得到的矩形区域。单元格可看作是大小为1×1的特殊区域。区域的构造有多种方法,下面分一般区域、用活动单元格构造的区域、用偏移得到的区域、用名称引用区域和引用区域内的单元格等几种情况进行介绍。

一、引用一般区域

引用一般区域,需要指定区域左上角和右下角单元格的坐标,二者之间用冒号隔开组成字符串作为工作表对象Range(range)属性的唯一参数,或者各自作为字符串作为Range(range)属性的两个参数。指定区域左上角和右下角单元格的坐标时也可以使用工作表对象的Range(range)属性或Cells(cells)属性来获取。下面引用和选择一个区域A3:C8:

【xlwings】

code.python
>>> sht.range("A3:C8").select()
>>> sht.range("A3","C8").select()
>>> sht.range(sht.range("A3"),sht.range("C8")).select()
>>> sht.range(sht.cells(3,1),sht.cells(8,3)).select()
>>> sht.range((3,1),(8,3)).select()

【xlwings API】

code.python
>>> sht.api.Range("A3:C8").Select()
>>> sht.api.Range("A3","C8").Select()
>>> sht.api.Range(sht.api.Range("A3"), sht.api.Range("C8")).Select()
>>> sht.api.Range(sht.api.Cells(3,1),sht.api.Cells(8,3)).Select()

效果如图2-3所示。

Document Image

图2-3 选择一个区域

二、引用用活动单元格构造的区域

区域起点或终点为活动单元格时,用活动单元格的引用进行替换即可。下面指定要引用区域的左上角单元格为A3,右下角单元格为活动单元格,选择它:

【xlwings API】

code.python
>>> sht.api.Range("A3", app.api.ActiveCell).Select()

三、引用偏移构造的区域

通过对已有区域进行整体偏移,可以得到一个新的区域。使用区域对象的offset(Offset)方法进行偏移。使用xlwings方式和其他两种实现方式时,在使用上有所不同。

使用xlwings方式时,offset方法可以对给定的区域进行整体平移,而使用另外两种方式时,Offset方法只能对区域的左上角进行平移。所以,对于后者,分别对区域的左上角和右下角进行平移后,重新组合成一个区域进行选择。

另外,两种使用方式下offset(Offset)方法的参数意义有所不同。

对于xlwings方式,只给一个参数时,表示上下方向的偏移,大于0时表示向下偏移,小于0时表示向上偏移。给两个参数时,如果第一个参数的值为0,表示左右方向的偏移,大于0时表示向右偏移,小于0时表示向左偏移。如果两个参数都不为0,表示上下和左右两个方向都有偏移。

对于其他两种方式,参数使用有一点不同,就是基数为1,即上面xlwings方式描述中值为0的地方替换为1。

code.python
【xlwings】
>>> sht.range("A3:C8").offset(1).select()   #A4:C9
>>> sht.range("A3:C8").offset(0,1).select()   #B3:D8
>>> sht.range("A3:C8").offset(1,1).select()   #B4:D9

【xlwings API】

code.python
>>> sht.api.Range(sht.api.Range("A3").Offset(2),sht.api.Range("C8").Offset(2)).Select()   #A4:C9
>>> sht.api.Range(sht.api.Range("A3").Offset(1,2),sht.api.Range("C8").Offset(1,2)).Select()   #B3:D8
>>> sht.api.Range(sht.api.Range("A3").Offset(2,2),sht.api.Range("C8").Offset(2,2)).Select()   #B4:D9

四、用名称引用区域

如果区域有名称,可以用名称引用区域。下面给A3:C8区域命名为MyData,然后用该名称引用区域。

【xlwings】

code.python
>>> cl = sht.range("A3:C8")
>>> cl.name = "MyData"
>>> sht.range("MyData").select()

【xlwings API】

code.python
>>> cl = sht.api.Range("A3:C8")
>>> cl.Name = "MyData"
>>> sht.api.Range("MyData").Select()

五、引用区域内的单元格

引用区域内的单元格,有坐标索引、线性索引和切片等几种方法。

坐标索引,单元格在区域内的坐标是相对坐标,是相对于区域左上角计算得到的。跟前面区域偏移的计算方法相同。需要注意的是,使用xlwings方式和其他两种方式,偏移的基数不同,前者基数为0,后者为1。

【xlwings】

code.python
>>> rng=sht.range('B2:D5')
>>> rng[0,0].select()  #B2,注意基数为0

【xlwings API】

code.python
>>> rng=sht.api.Range("B2:D5")
>>> rng(1,1).Select()

线性索引的索引参数只有一个,其值是对区域内的单元格按照先行后列的顺序进行编号得到的。注意,使用xlwings方式时,编号是从0开始的,如下面格式所示。

0 1 2

3 4 5

使用API方式时,编号是从1开始的,如下面格式所示。

1 2 3

4 5 6

对于给定的区域B2:D5,下面用线性索引引用单元格D2。

【xlwings】

code.python
>>> rng=sht.range('B2:D5')
>>> rng[2].select()

【xlwings API】

code.python
>>> rng=sht.api.Range("B2:D5")
>>> rng(3).Select()

使用xlwings方式,通过切片可以从区域内取出部分连续数据。

code.python
>>> rng=sht.range('B2:D5')
>>> rng[1:3,1:3].select()  #切片 C3:D4
>>> rng[:,2].select()   #切片  D2:D5

引用所有单元格/特殊区域/区域的集合

本小节介绍所有单元格的引用、多个区域的引用、当前区域、已用区域的引用,以及区域的并和交的引用等内容。

一、引用所有单元格

引用工作表中的所有单元格,使用xlwings方式,可以使用工作表对象的cells属性。使用另外两种方式,还可以通过引用所有行或所有列来实现。

【xlwings】

code.python
>>> sht.cells.select()

【xlwings API】

code.python
>>> sht.api.Cells.Select()
>>> sht.api.Range(sht.api.Cells(1,1),sht.api.Cells(sht.api.Cells.Rows.Count,sht.api.Cells. Columns.Count)).Select()

引用所有行

code.python
>>> sht.api.Rows.Select()

引用所有列

code.python
>>> sht.api.Columns.Select()

二、引用特殊区域

这里介绍的特殊区域包括多个区域、指定单元格的当前区域和指定工作表的已用区域等。

一次引用多个区域

用列表工作表对象的Range(range)属性一次引用多个区域时,多个区域之间用逗号间隔,区域用区域左上角单元格和右下角单元格的坐标表示,坐标之间用冒号间隔。下面一次引用和选择工作表sht中的A2, B3:C8, E2:F5等3个区域。

【xlwings】

code.python
>>> sht["A2, B3:C8, E2:F5"].select()
>>> sht.range("A2, B3:C8, E2:F5").select()

【xlwings API】

code.python
>>> sht.api.Range("A2, B3:C8, E2:F5").Select()

效果如图2-4所示。

Document Image

图2-4 一次引用多个区域

2. 引用指定单元格的当前区域

下面介绍单元格当前区域的引用。首先,什么是给定单元格的当前区域?图2-5中阴影部分表示的是单元格C3的当前区域。所以,单元格的当前区域,指的是从该单元格向上下左右四个方向扩展,直到包含数据的矩形区域第一次被空格组成的矩形环包围,即在四个方向上都是空行或空列(在区域的范围内为空行空列,不是指整个行是空行空列),这个区域就是该单元格的当前区域。

Document Image

图2-5 单元格C3的当前区域

引用给定单元格的当前区域,在xlwings方式下使用单元格对象的current_region属性,API方式下使用CurrentRegion属性。

【xlwings】

code.python
>>> sht.range("C3").current_region.select()

【xlwings API】

code.python
>>> sht.api.Range("C3").CurrentRegion.Select()

引用工作表的已用区域

工作表的已用区域,指的是工作表中包含所有数据的最小区域。在xlwings方式下使用单元格对象的used_range属性,另两种方式下使用UsedRange属性引用指定工作表的已用区域。

【xlwings】

code.python
>>> sht.used_range.select()

【xlwings API】

code.python
>>> sht.api.UsedRange.Select()

对于工作表sht中给定的单元格数据,它的已用区域如图2-6所示。

Document Image

图2-6 工作表的已用区域

三、引用区域的集合

区域的集合运算包括区域的并运算和区域的交运算。如图2-7中,两个矩形区域放在一起,有部分重叠。它们的并包括全部阴影部分,它们的交为二者的重叠部分,即图中深色阴影部分。

Document Image

图2-7 区域的并与交

使用xlwings的API方式,用Application对象的Union方法获取两个区域的并,用Intersect方法获取两个区域的交。下面计算区域B4:D8和C2:F5的并和交。

【xlwings API】

code.python
>>> app.api.Union(sht.api.Range("B4:D8"), sht.api.Range("C2:F5")).Select()
>>> app.api.Intersect(sht.api.Range("B4:D8"), sht.api.Range("C2:F5")).Select()

扩展引用当前工作表中的单元格区域

前面我们介绍了区域的偏移,它是通过将区域整体平移来获取新的区域。这里介绍另外一种方式,即通过对已有单元格向上下左右扩展来获得新的区域。使用单元格对象的Resize(resize)方法扩展区域。注意使用xlwings方式进行扩展时,使用方式与另外两种的有所不同。

使用xlwings方式时,resize方法可以直接得到扩展后的区域,而使用另外两种方式时,Resize方法只能得到原单元格扩展后的位置上的单元格。所以,对于后者,首先获取区域的右下角单元格,与原单元格重新组合成一个区域。

只给一个参数时,表示上下方向的扩展,大于1时表示向下扩展,小于1时表示向上扩展。给两个参数时,如果第一个参数的值为1,表示左右方向的扩展,大于1时表示向右扩展,小于1时表示向左扩展。如果两个参数都不为1,表示上下和左右两个方向都有扩展。

下面演示通过对指定单元格C2进行上下、左右和行列三个方向扩展来得到新的区域,选择它们。

【xlwings】

code.python
>>> sht.range("C2").resize(3).select()   #创建C2:C4单元格区域
>>> sht.range("C2").resize(1, 3).select()    #创建C2:E2单元格区域
>>> sht.range("C2").resize(3, 3).select()    #创建C2:E4单元格区域

【xlwings API】

code.python
>>> sht.api.Range("C2", sht.api.Range("C2").Resize(3)).Select()
>>> sht.api.Range("C2", sht.api.Range("C2").Resize(1, 3)).Select()
>>> sht.api.Range("C2", sht.api.Range("C2").Resize(3, 3)).Select()

从当前单元格开始创建一个3行3列的区域。

【xlwings API】

code.python
>>> sht.api.Range(app.api.ActiveCell, app.api.ActiveCell.Resize(3, 3)).Select()

使用xlwings方式,用单元格对象的expand方法,还可以得到另外一种扩展结果。对于区域内的一个单元格,使用它的expand方法,可以获取区域内它至右端的行区域、至底部的列区域,以及它所在的整个表格区域。

注意:该方法只向右和向下扩展。

code.python
>>> sht.range("C4").expand("table").select()
>>> sht.range("C4").expand().select()    #与上面的使用方式等价
>>> sht.range("C4").expand("down").select()
>>> sht.range("C4").expand("right").select()

用expand方法对C4单元格进行table扩展后的效果如图2-8所示。

Document Image

图2-8 用expand方法进行table扩展

引用末行或末列

引用末行或末列,即获取数据区末行的行号或末列的列号。

引用末行有两种方法,一是从顶部某单元格开始从上往下找,数据区的末行即最后一个非空行;二是从工作表的底部往上找,为数据区内遇到的第一个非空行。这里用到单元格对象的End(end)方法。

示例工作表如图2-9所示,用不同方式获取数据区末行的行号和末列的列号。

Document Image

图2-9 示例工作表

【xlwings】

code.python
>>> sht.range("A1").end("down").row
2
>>> sht.cells(1,1).end("down").row
2
>>> sht.range("A"+str(sht.api.Rows.Count)).end("up").row
2
>>> sht.cells(sht.api.Rows.Count,1).end("up").row
2

【xlwings API】

code.python
>>> sht.api.Range("A1").End(xw.constants.Direction.xlDown).Row
2
>>> sht.api.Cells(1,1).End(xw.constants.Direction.xlDown).Row
2
>>> sht.api.Range("A"+str(sht.api.Rows.Count)).End(xw.constants.Direction.xlUp).Row
2
>>> sht.api.Cells(sht.api.Rows.Count,1).End(xw.constants.Direction.xlUp).Row
2

下面使用xlwings和API两种方式引用末列。引用末列也有两种方法,一是从左侧某单元格开始从左往右找,数据区的末列即最后一个非空列;二是从工作表的最右端往左找,为数据区内遇到的第一个非空列。end方法的参数为right时从左往右找,参数为left时从右往左找。

【xlwings】

code.python
>>> sht.range("A1").end("right").column
5
>>> sht.cells(1,1).end("right").column
5
>>> sht.cells(1,sht.api.Columns.Count).end("left").column
5

【xlwings API】

code.python
>>> sht.api.Range("A1").End(xw.constants.Direction.xlToRight).Column
5
>>> sht.api.Cells(1,1).End(xw.constants.Direction.xlToRight).Column
5
>>> sht.api.Cells(1,sht.api.Columns.Count).End(xw.constants.Direction.xlToLeft).Column
5

引用特殊的单元格

所谓特殊的单元格,指的是内容为空的单元格、有批注的单元格、有公式的单元格等。使用单元格对象的SpecialCells方法,可以把这些特殊的单元格找出来。需要使用xlwings API使用方式,其引用格式为:

code.python
区域对象.SpecialCells(Type,Value)

该方法有两个参数,第1个参数Type为必选参数,表示特殊单元格的类型,其取值如表2-1所示。第2个参数Value为可选参数,当Type的值为xlCellTypeConstants或xlCellTypeFormulas时设置必要的值。

表2-1 SpecialCells方法的参数

名 称 说 明
xlCellTypeAllFormatConditions -4172 任意格式的单元格。
xlCellTypeAllValidation -4174 含有验证条件的单元格。
xlCellTypeBlanks 4 空单元格。
xlCellTypeComments -4144 含有注释的单元格。
xlCellTypeConstants 2 含有常量的单元格。
xlCellTypeFormulas -4123 含有公式的单元格。
xlCellTypeLastCell 11 所用区域中的最后一个单元格。
xlCellTypeSameFormatConditions -4173 格式相同的单元格。
xlCellTypeSameValidation -4175 验证条件相同的单元格。
xlCellTypeVisible 12 所有可见单元格。

下面的例子用SpecialCells方法选择单元格A1当前区域中的空白单元格。

【xlwings API】

code.python
>>> sht.api.Range("A1").CurrentRegion.SpecialCells(xw.constants.CellType.xlCellTypeBlanks).Select()

选择效果如图2-10所示。

Document Image

图2-10 选择空白单元格

区域的行数/列数/左上角/右下角/形状/大小

下面介绍几个跟区域的维度、形状、大小等有关的量。

使用区域对象的Rows(rows)和Columns(columns)属性返回对象的Count(count)属性,可以获取区域的行数和列数。下面获取工作表sht已用区域的行数和列数。使用图2-9所用数据。

【xlwings】

code.python
>>> sht.used_range.rows.count
2
>>> sht.used_range.columns.count
5

【xlwings API】

code.python
>>> sht.api.UsedRange.Rows.Count
2
>>> sht.api.UsedRange.Columns.Count
5

使用区域对象的Row(row)和Column(column)属性,可以获取区域左上角单元格的坐标,即其行号和列号。

【xlwings】

code.python
>>> sht.used_range.row
1
>>> sht.used_range.column
1

【xlwings API】

code.python
>>> sht.api.UsedRange.Row
1
>>> sht.api.UsedRange.Column
1

在xlwings使用方式下,使用区域对象的last_cell属性返回对象的row和column属性,可以获取区域右下角单元格的坐标,即其行号和列号。另外两种方式下可利用工作表的已用区域来获取区域右下角单元格的坐标。

【xlwings】

code.python
>>> sht.used_range.last_cell.row
2
>>> sht.used_range.last_cell.column
5

【xlwings API】

code.python
>>> rng=sht.api.UsedRange
>>> rng.Rows(rng.Rows.Count).Row
2
>>> rng.Columns(rng.Columns.Count).Column
5

使用xlwings方式,引用区域对象的shape属性,可以获取区域的形状。

code.python
>>> sht.used_range.shape
(2, 5)

使用xlwings方式,引用区域对象的size属性,可以获取区域的大小。

code.python
>>> sht.used_range.size
10

插入单元格或区域

使用单元格对象的Insert(insert)方法,可以插入单元格或区域。

在xlwings使用方式下,insert方法的语法格式为:

code.python
单元格或区域对象.insert(shift=None, copy_origin="format_from_left_or_above")

其中,

• shift参数 - 定义插入单元格或区域的方向,值为"down"时为上下方向插入,原位置以下的数据依次往下移;值为"right"时为左右方向插入,原位置及其右边的数据依次往右边移。

• copy_origin参数 – 表示插入的单元格或区域的格式与周边哪个的相同。值为"format_from_left_or_above"时与左侧或上边单元格或区域的相同,值为"format_from_right_or_below"时与右侧或下边单元格或区域的相同。

在另外两种使用方式下,Insert方法的语法格式为:

code.python
单元格或区域对象.Insert(Shift, CopyOrigin)

其中,

• Shift参数 - 定义插入单元格或区域的方向,值为xw.constants.InsertShiftDirection.xlShiftDown时为上下方向插入,原位置以下的数据依次往下移;值为xw.constants.InsertShiftDirection.xlShiftRight时为左右方向插入,原位置及其右边的数据依次往右边移。

• CopyOrigin参数 – 表示插入的单元格或区域的格式与周边哪个的相同。值为xw.constants.InsertFormatOrigin.xlFormatFromLeftOrAbove时与左侧或上边单元格或区域的相同,值为xw.constants.InsertFormatOrigin.xlFormatFromRightOrBelow时与右侧或下边单元格或区域的相同。

对于图2-11所示的工作表数据,设置A1单元格的背景色为绿色,在A2处和B4:C5处插入单元格和区域。

【xlwings】

code.python
>>> sht.range("A1").color=(0,255,0)
>>> sht.range("A2").insert(shift="down",copy_origin="format_from_left_or_above")
>>> sht.range("B4:C5").insert()

【xlwings API】

code.python
>>> sht.api.Range("A1").Interior.Color=xw.utils.rgb_to_int((0, 255, 0))
>>> sht.api.Range("A2").Insert(Shift=xw.constants.InsertShiftDirection.xlShiftDown, CopyOrigin=xw.constants.InsertFormatOrigin.xlFormatFromLeftOrAbove)
>>> sht.api.Range("B4:C5").Insert()

插入后的效果如图2-12所示。可见,在A2处插入的单元格复制了A1单元格的格式。按照设置,插入单元格或区域后,原来位置及其以下数据依次向下移动。

Document Image Document Image

图2-11 原工作表数据 图2-12 插入单元格和区域后的工作表

单元格的选择和清除

选择单元格有两种方法,即激活或选择,分别用单元格对象的Activate方法(仅用于xlwings API方式)或Select(select)方法实现。

【xlwings】

code.python
>>> sht.range("A1:B10").select()

【xlwings API】

code.python
>>> sht.api.Range("A1:B10").Select()
>>> sht.api.Range("A1:B10").Activate()

选取不连续单元格和区域,只需引用不连续单元格和区域,然后激活或选择即可。下面是xlwings和另外两种方式下的实现方法。使用另外两种方式,还可以通过区域的并运算来实现。

【xlwings】

code.python
>>> sht.range("A1:A5,C3,E1:E5").select()

【xlwings API】

code.python
>>> sht.api.Range("A1:A5,C3,E1:E5").Activate()
>>> sht.api.Range("A1:A5,C3,E1:E5").Select()
>>> pid=xw.apps.keys()
>>> app=xw.apps[pid[0]]
>>> app.api.Union(sht.api.Range("A1:A5"),sht.api.Range("C3"),sht.api.Range("E1:E5")).Select()

选择效果如图2-13所示。

Document Image

图2-13 选取不连续单元格和区域

清除单元格或区域中的内容,可以有多种选择。下面使用Clear(clear)方法清除全部内容:

【xlwings】

code.python
>>> sht.range("B1:B5").clear()

【xlwings API】

code.python
>>> sht.api.Range("B1:B5").Clear()

使用ClearContents(clear_contents)方法清除正文内容:

【xlwings】

code.python
>>> sht.range("B1:B5").clear_contents()

【xlwings API】

code.python
>>> sht.api.Range("B1:B5").ClearContents()

使用ClearComments方法清除批注:

【xlwings API】

code.python
>>> sht.api.Range("B1:B5").ClearComments()
>>> sht.api.Range("B1:B5").ClearFormats()

单元格的复制/粘贴/剪切和删除

复制和粘贴单元格区域的完整过程描述如下:

【xlwings API】

code.python
>>> sht.range("A1").select()
>>> bk.selection.api.Copy()
>>> sht.range("C1").select()
>>> sht.api.Paste()

首先是选择要复制的单元格或区域,用Copy方法将数据复制到剪贴板,然后选择进行粘贴的目标单元格或区域,用Paste方法进行粘贴。省略选择单元格或区域的步骤,该代码可以简化为:

【xlwings API】

code.python
>>> sht.api.Range("A1").Copy(sht.api.Range("C1"))

其中,A1是源单元格,C1是目标单元格。

下面将单元格A1的当前区域复制到A4为左上角单元格的目标区域。

【xlwings API】

code.python
>>> sht.api.Range("A1").CurrentRegion.Copy(sht.api.Range("A4"))

效果如图2-14所示。

Document Image

图2-14 复制区域到指定位置

在xlwings API使用方式下,使用单元格对象的PasteSpecial方法,可以进行选择性粘贴。该方法的语法格式为:

code.python
单元格区域对象.PasteSpecial(Paste, Operation, SkipBlanks, Transpose)

PasteSpecial方法有4个参数:

• Paste参数:表示选择性粘贴的类型,取值如表2-2所示。

表2-2 Paste参数的取值

名 称 说 明
xlPasteAll -4104 粘贴全部内容。
xlPasteComments -4144 粘贴批注。
xlPasteFormats -4122 粘贴复制的源格式。
xlPasteFormulas -4123 粘贴公式。
xlPasteFormulasAndNumberFormats 11 粘贴公式和数字格式。
xlPasteValues -4163 粘贴值。
xlPasteValuesAndNumberFormats 12 粘贴值和数字格式。

• Operation参数:粘贴时是否与原有内容进行运算以及运算的类型。其取值如表2-3所示。

表2-3 Operation参数的取值

名 称 说 明
xlPasteSpecialOperationAdd 2 复制的数据将被添加到目标单元格中的值。
xlPasteSpecialOperationDivide 5 复制的数据将除以目标单元格中的值。
xlPasteSpecialOperationMultiply 4 复制的数据将与目标单元格中的值相乘。
xlPasteSpecialOperationNone -4142 粘贴操作中不执行任何计算。
xlPasteSpecialOperationSubtract 3 复制的数据将从目标单元格中的值中减去。

• SkipBlanks参数:忽略空白单元格。

• Transpose参数:对行列数据进行转置。

下面举例说明该方法的使用。

下面的代码把图2-9中工作表内第1行的数据复制到第4行。

【xlwings API】

code.python
>>> sht.api.Range("A1:E1").Copy()
>>> sht.api.Range("A4:E4").PasteSpecial(Paste=xw.constants.PasteType.xlPasteValues)

下面的代码先给单元格B1添加一个批注,然后将工作表内第1行的批注复制到第5行。

【xlwings API】

code.python
>>> sht.api.Range("B1").AddComment("CommentTest")
>>> sht.api.Range("A1:E1").Copy()
>>> sht.api.Range("A5:E5").PasteSpecial(Paste=xw.constants.PasteType.xlPasteComments)

下面的代码先给单元格A2添加一些格式,包括设置背景色为绿色,设置字体大小为20,加粗,倾斜,然后将工作表内第2行的格式复制到第6行。

【xlwings API】

code.python
>>> sht.range("A2").color=(0,255,0)
>>> sht.api.Range("A2").Font.Size=20
>>> sht.api.Range("A2").Font.Bold=True
>>> sht.api.Range("A2").Font.Italic=True
>>> sht.api.Range("A2:E2").Copy()
>>> sht.api.Range("A6:E6").PasteSpecial(Paste=xw.constants.PasteType.xlPasteFormats)

最后得到的效果如图2-15所示。

Document Image

图2-15 选择性粘贴

剪切操作,实际上是进行复制粘贴以后把原来位置上的数据删除。使用单元格对象的Cut方法把源单元格的内容移动到目标单元格。下面把A1:E1区域的数据剪切到A7:E7:

【xlwings API】

code.python
>>> sht.api.Range("A1:E1").Cut(Destination=sht.api.Range("A7"))

参数名称Destination可以省略:

【xlwings API】

code.python
>>> sht.api.Range("A1:E1").Cut(sht.api.Range("A7"))

用单元格对象的delete(Delete)方法删除单元格或区域。

使用xlwings方式时,delete方法的语法格式为:

code.python
rng.delete(shift=None)

其中,rng为单元格或区域对象。shift参数的取值为"left"或"up",值为"up"时,删除单元格后,该单元格下面的单元格依次往上移;值为"left"时,删除单元格后,该单元格右侧的单元格依次往左移。如果不带参数,Excel会根据前面的引用情况自行判断使用哪个值。

使用另外两种方式时,Delete方法的语法格式为:

code.python
rng.Delete(Shift)

其中,rng为单元格或区域对象。shift参数的取值xlShiftToUp时,删除单元格后,该单元格下面的单元格依次往上移;值为xlShiftLeft时,删除单元格后,该单元格右侧的单元格依次往左移。如果不带参数,Excel会根据前面的引用情况自行判断使用哪个值。

下面删除单元格A2和区域C3:E5。

【xlwings】

code.python
>>> sht["A2"].delete(shift="up")
>>> sht["C3:E5"].delete()

【xlwings API】

code.python
>>> sht.api.Range("A2").Delete(Shift=xw.constants.DeleteShiftDirection.xlShiftToUp)
>>> sht.api.Range("C3:E5").Delete()

单元格的名称、批注和字体设置

用单元格对象的Name(name)属性获取或设置单元格或区域的名称。下面给单元格C3设置名称test,然后用该名称进行引用。

【xlwings】

code.python
>>> cl=sht.cells(3,3)
>>> cl.name="test"
>>> sht.range("test").select()

【xlwings API】

code.python
>>> cl=sht.api.Range("C3")
>>> cl.Name="test"
>>> sht.api.Range("test").Select()

也可以给区域设置名称,并用名称引用区域。下面给A3:C8区域命名为MyData,然后用该名称引用区域。

【xlwings】

code.python
>>> cl =sht.range("A3:C8")
>>> cl.name ="MyData"
>>> sht.range("MyData").select()

【xlwings API】

code.python
>>> cl=sht.api.Range("A3:C8")
>>> cl.Name ="MyData"
>>> sht.api.Range("MyData").Select()

使用单元格对象的AddComment方法给单元格添加批注。用该方法的Text属性设置批注的内容。

【xlwings API】

code.python
>>> sht.api.Range("A3").AddComment(Text="单元格批注")

使用单元格对象的Comment属性获取单元格的批注。它是一个Comment对象,有批注相关的若干属性,利用它们,可以对批注进行设置。Comments是工作簿中所有Comment对象的集合

下面用一个判断结构判断单元格A3中是否有批注。

【xlwings API】

code.python
>>> if sht.api.Range("A3").Comment is None:
		Print("A3单元格中没有批注。")
	else:
		Print("A3单元格中已有批注。")

用Comment对象的Visible属性隐藏A3单元格中的批注:

【xlwings API】

code.python
>>> sht.api.Range("A3").Comment.Visible=False

用Comment对象的Delete方法删除A3单元格中的批注:

【xlwings API】

code.python
>>> sht.api.Range("A3").Comment.Delete()

单元格对象的Font属性返回一个Font对象。利用Font对象的属性和方法,可以对单元格或区域中的文本进行字体设置。

下面的代码设置A1:E1区域内的字体样式:

【xlwings API】

code.python
>>> sht.api.Range("A1:E1").Font.Name = "宋体"       #设置字体为宋体
>>> sht.api.Range("A1:E1").Font.ColorIndex = 3       #设置字体颜色为红色
>>> sht.api.Range("A1:E1").Font.Size = 20       #设置字号为20号
>>> sht.api.Range("A1:E1").Font.Bold = True      #设置字体加粗
>>> sht.api.Range("A1:E1").Font.Italic = True      #设置字体倾斜显示
>>> sht.api.Range("A1:E1").Font.Underline=xw.constants.UnderlineStyle.xlUnderlineStyleDouble       #给文字添加双下划线

设置效果如图2-16所示。

Document Image

图2-16 单元格区域中的字体设置

下划线样式的设置,参见表2-4。

表2-4 下划线样式的设置

名 称 说 明
xlUnderlineStyleDouble -4119 粗双下划线。
xlUnderlineStyleDoubleAccounting 5 紧靠在一起的两条细下划线。
xlUnderlineStyleNone -4142 无下划线。
xlUnderlineStyleSingle 2 单下划线。
xlUnderlineStyleSingleAccounting 4 不支持。

关于字体颜色的设置,有几种设置方法。

第1种是设置为RGB颜色。即用红色、绿色和兰色分量来定义颜色。使用Font对象的Color属性进行设置。如果习惯于指定RGB分量来设置颜色,可以使用xlwings.utils模块中的rgb_to_int方法将类似(255,0,0)的RGB分量指定转换为整型值,然后设置给Color属性。

【xlwings API】

code.python
>>> sht.api.Range("A3:E3").Font.Color =xw.utils.rgb_to_int((0, 0, 255))

也可以直接将一个表示颜色的整数,也就是xw.utils.rgb_to_int()函数的结果赋给Color属性。

【xlwings API】

code.python
>>> sht.api.Range("A3:E3").Font.Color =16711680  # 或0x0000FF

第2种方法是使用索引着色。此时需要有一张颜色查找表,如图2-17所示。预定义了很多颜色,而且每个颜色都有一个唯一的索引号。进行索引着色时,将某个索引号指定给Font对象的ColorIndex属性就可以了。

Document Image

图2-17 索引着色的颜色查找表

下面将A1:E1区域内的字体颜色设置为红色:

【xlwings API】

code.python
>>> sht.api.Range("A1:E1").Font.ColorIndex = 3

第3种方法是使用主题颜色。系统预定义了很多主题颜色,可以便捷地使用它们进行字体着色。每个主题颜色有对应的整数编号,将必要的编号指定给Font对象的ThemeColor属性即可。

下面将A3:E3区域内的字体颜色设置为淡兰色:

【xlwings API】

code.python
>>> sht.api.Range("A3:E3").Font.ThemeColor =5

单元格的对齐方式、背景色和边框

单元格内容的对齐,有水平方向的对齐和垂直方向的对齐,分别用单元格对象的HorizontalAlignment和VerticalAlignment属性设置。

HorizontalAlignment属性的取值参见表2-5,VerticalAlignment属性的取值参见表2-6。

表2-5 HorizontalAlignment属性的取值

名 称 说 明
xlHAlignCenter -4108 居中对齐
xlHAlignCenterAcrossSelection 7 跨列居中对齐
xlhaligndistributedxlhalignfill -4117 分散对齐
xlhaligngeneral 5 填充
xlhalignjustify 1 按数据类型对齐
xlhalignleft -4130 两端对齐
xlHAlignLeft -4131 左对齐
xlHAlignRight -4152 右对齐

表2-6 VerticalAlignment属性的取值

名 称 说 明
xlVAlignBottom -4107 底对齐
xlVAlignCenter -4108 居中对齐
xlVAlignDistributed -4117 分散对齐
xlVAlignJustify -4130 两端对齐
xlVAlignTop -4160 顶对齐

下面设置单元格C3中的内容水平居中对齐和垂向居中对齐。

【xlwings API】

code.python
>>> sht.api.Range("C3").HorizontalAlignment = xw.constants.Constants.xlCenter
>>> sht.api.Range("C3").VerticalAlignment = xw.constants.Constants.xlCenter

使用xlwings方式,可以直接给单元格对象的color属性赋值。颜色可以用(R,G,B)形式的RGB颜色设置,其中,R, G, B各分量从0~255中间取值。

使用另外方式,用单元格对象的Interior属性设置其背景色。该属性返回一个Inerior对象,使用该对象的Color属性、ColorIndex属性和ThemeColor属性,可以用RGB颜色着色、索引着色和主题颜色着色等不同的方法对单元格进行着色。关于这几种着色方式,在介绍字体颜色的着色时有详细介绍,请参阅。

下面是两种使用方式下的一些例子:

【xlwings】

code.python
>>> sht.range("A1:E1").color=(210, 67, 9)
>>> sht["A:A, B2, C5, D7:E9"].color=(100,200,150)

【xlwings API】

code.python
>>> sht.api.Range("A1:E1").Interior.Color=xw.utils.rgb_to_int((0, 255, 0))
>>> sht.api.Range("A1:E1").Interior.Color=65280
>>> sht.api.Range("A1:E1").Interior.ColorIndex=6
>>> sht.api.Range("A1:E1").Interior.ThemeColor=5

用单元格或区域对象的Borders属性设置表框。该对象返回Borders对象,利用其属性和方法设置表框的颜色、线型和线宽等。

下面的代码对B2的当前区域设置表框:

【xlwings API】

code.python
>>> sht.api.Range("B2").CurrentRegion.Borders.LineStyle=xw.constants.LineStyle.xlContinuous
>>> sht.api.Range("B2").CurrentRegion.Borders.ColorIndex=3
>>> sht.api.Range("B2").CurrentRegion.Borders.Weight=xw.constants.BorderWeight.xlThick

表框设置效果如图2-18所示。[大谦Excel,dqexcel点com]

Document Image

图2-18 表框设置效果