添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

全网最详细的xlwings库解析(4) -- Python操作区域&单元格

上篇介绍了如何使用xlwings来操作Excel工作簿和工作表,这次我们继续学习用xlwings来操作区域和单元格,下面开始!

注意:Excel单元格不要处于编辑状态,不然代码会卡主,无法运行


上篇文章已经说了,要操作一个对象,首先要引用他,所以我们在操作区域或者单元格之前,首先就要引用他们,下面我们就来介绍如何引用一个区域。

引用

1. 引用区域

引用区域的方式有很多种,下面列举出所有可用的引用方式:

xw.Range('A1:C3')
xw.Range((1,1), (3,3))
xw.Range(xw.Range('A1'),xw.Range('C3'))
xw.Range(xw.Range('A1:F6'),xw.Range('B2:D5'))
xw.Range('NamedRange')
app.range("A1") 
sht.range('A1') 
xw.books['MyBook.xlsx'].sheets[0].range('A1')
cell1 (str or tuple or Range) – 区域左上角的名字,可以是A1表示法、坐标元组、名字或者是xw.Range对象。也可用用区域操作符号(例如 ‘A1:B2’ )来表示。 cell2 (str or tuple or Range, default None) – 区域右下角角的名字,可以是A1表示法、坐标元组、名字或者是 xw.Range 对象。

要理解这些引用方式的不同点,只需要彻底理解上面这段官方说明即可,这里就不做解释了。
注意:单元格也是区域的一种哦,可以简单理解为是最小的区域。

2. 返回选中的区域

app.selection
wb.selection

3. 调整区域

3-1.偏移区域

rng.offset(row_offset=3,column_offset=5)
返回一个从指定单元格为起始点的区域对象

这句话什么意思呢?就是将选区范围进行偏移,row_offset决定行偏移量(正数表示向下偏移,负数相反),column_offset决定列偏移量(正数表示向右偏移,负数相反)
注意:是将 选区范围 进行偏移,而不是将 选区内容 进行偏移,注意区别哦!

3-2.扩展区域

rng.expand(mode='table')

参数可选取 'down' , 'right' ,'table' ,效果分别等同于Ctrl+Shift+↓,Ctrl+Shift+→,Ctrl+Shift+↓→,这是Excel的一种快捷操作,懂得都懂
注意:实际效果与预期的可能并不相符,尤其是存在空白单元格的时候,小朋友们要自己去尝试哦

3-3.调整区域大小

rng.resize(row_size=6, column_size=4)

参数:

  • row_size (int > 0)
    • 新的区域的行数(如果为 None , 区域保持原来的行数不变)
  • column_size (int > 0)
    • 新的区域的列数(如果为 None , 区域保持原来的列数不变)


3-4.全选区域

rng.current_region

与Ctrl + A效果相同,不解释

OK,到了现在,无论如何,我们终于选中了想要的区域,下面我们就要看看这片区域的属性,并对它进行操作了。

属性

1. 名称管理

'获取区域名称'
rng.name
'设置区域名称'
rng.name = "zhouxiaodi"

如果没有名称,则返回空

2. 获取区域宽高

rng.height
rng.width

3. 计数

rng.count
rng.size

返回区域内单元格数量
注意:我在测试过程中未发现这两种方式有何不同,暂且看做是同一种功能的不同写法吧

4. 定位边界单元格

rng.end(direction)
rng.end('down')

返回区域内的边界单元格
参数可选:'up','down','right','left'。得到的结果与按 Ctrl+Up , Ctrl+down , Ctrl+left 或 Ctrl+right 组合键得到的结果相同

5. 定位右下角单元格

rng.last_cell

返回指定区域的右下角单元格

6. 返回区域所属的工作表

rng.sheet

7. 返回区域引用字符串

rng.address
返回:'$C$1:$D$1'
rng.get_address(row_absolute=True, column_absolute=True, include_sheetname=False, external=False)

参数:

  • row_absolute (bool, default True) – 设为 True 时,返回行部分的绝对引用。
  • column_absolute (bool, default True) – 设为 True 时,返回列部分的绝对引用。
  • include_sheetname (bool, default False) – 设为 True 时,返回的地址中包含工作表名。如果 external=True ,不管这里的设置如何,都带工作表名。
  • external (bool, default False) – 设为 True 时,返回带有工作簿名和工作表名的外部引用地址。


这里涉及到了绝对引用和相对引用,算是Excel 的基本常识,懂的自然懂,不懂的……连这都不懂,建议你赶紧关掉这篇文章

8. 其他

'返回A列的左边缘到区域的左边界的距离'
rng.left
'返回从第一行的边缘到区域边缘的距离'
rng.top

操作

1. 选中区域

rng.select()

注意:只能在活动的工作表中选,如果rng区域并不属于当前活动工作表,就会报错。

2. 赋值

'获取区域值'
rng.value
'设置区域的值'
rng.value = 1

另外,还有一种赋值方式:

rng.raw_value
不经过xlwings的数据处理,直接对底层引擎(pywin32 或 appscript)处理的值进行读取或者设置。这样能够提升速度但是也自然就依赖底层引擎了,举例来说,可能就把跨平台的兼容性丢掉了

以上是官方的解释,我的理解就是:反正我不用!

3. 设置公式

'获取公式'
rng.formula
'设置公式'
rng.formula = "=1+5"
'设置数组公式'
rng.formula_array='=sum(b1:b5)'
'获取数组公式'
rng.formula_array
'检测区域内是否包含数组公式'
rng.has_array

整个区域都是数组公式返回True,这些数组公式并不需要一样

4. 设置数字格式

'获取数字格式'
rng.number_format
'设置数字格式'
rng.number_format = '0.00%'

5. 复制

rng.copy(destination=None)

把一个区域拷贝到目的区域或者剪贴板
参数:destination 设置目标区域,如果省略,rng区域会被拷贝到剪贴板上

6. 粘贴

rng.paste(paste=None, operation=None, skip_blanks=False, transpose=False)

将剪贴板里内容粘贴到指定区域
参数:

  • paste
    • all_merging_conditional_formats(将粘贴所有内容,并且将合并条件格式)
    • all(粘贴全部内容)
    • all_except_borders(粘贴除边框外的全部内容)
    • all_using_source_theme(使用源主题粘贴全部内容)
    • column_widths(粘贴复制的列宽)
    • comments(粘贴批注)
    • formats(粘贴复制的源格式)
    • formulas(粘贴公式)
    • formulas_and_number_formats(粘贴公式和数字格式)
    • validation(粘贴有效性)
    • values(粘贴值)
    • values_and_number_formats(粘贴值和数字格式)
  • operation
    • add(加)
    • divide(除)
    • multiply(乘)
    • subtract(减)
  • skip_blanks (bool, default False)
    • 设为 True 时忽略空白单元格
  • transpose (bool, default False)
    • 设为 True 时对行列转置

7. 清除

'清除区域的内容,保留格式'
rng.clear_contents()
'清除区域的内容和格式'
rng.clear()

8. 删除

rng.delete(shift=None)

参数:shift (str, default None) – 使用 left 或 up 。如果省略,Excel根据区域的形状决定
可以理解为 右侧单元格左移 或者 下方单元格上移
注意:区域删除后,会被其他单元格补上,但是此时xlwings中的rng已经没了,需要重新选定这个区域才能继续操作

9. 插入

rng.insert(shift=None, copy_origin='format_from_left_or_above')

参数:

  • shift (str, default None)
    • 指定单元格的移动方向,可选:right 或者 down 。如果省略,Excel根据区域的形状决定。
  • copy_origin
    • 这个参数决定了**从何处复制插入单元格的格式,**可选 format_from_left_or_above 或 format_from_right_or_below,这里不做详细解释了,小朋友们自己去试一下喽。

10. 设置行高列宽

'返回区域第一行的行号'
rng.row
'返回区域的第一列的号'
rng.column

注意返回的列号不是ABCD,而是1234

'获取行高'
rng.row_height
'设置行高'
rng.row_height = 20
'获取列宽'
rng.column_width
'设置列宽'
rng.column_width = 20

到了这一步,小朋友又要发问了,如果各列宽度不统一,返回啥啊?答案是:返回None!

'返回一个代表指定区域内的行的 RangeRows 对象'
rng.rows
'返回一个代表指定区域内的行的 RangeColumns 对象'
rng.columns

什么TMD叫 RangeRows 和 RangeColumns 啊?别急,下篇文章咱们会介绍的

11. 自适应行高列宽

'调节行高列宽'
rng.autofit()
'宽度自适应'
rng.columns.autofit()
'高度自适应'
rng.rows.autofit()


12. 合并

12-1.合并单元格

rng.merge(across=False)

参数across默认为False,如果为True,则实现 跨越合并

注意:执行合并单元格时,会出现如下提示框,需要手动点击:

12-2.返回所在合并单元格区域

rng.merge_area

上面代码的返回的是rng所在的合并单元格区域,如果rng位于合并单元格内,则返回这个合并单元格,如果rng位于合并单元格外,则返回rng。
此时,聪明的小朋友又有疑问了:如果rng有一部分位于合并单元格内,有一部分位于合并单元格外,那返回什么?答案是:报错!

12-3.检测是否包含合并单元格

rng.merge_cells

如果rng区域内包含合并的单元格,则返回True,否则返回False
注意:这里的包含是rng区域完全在合并单元格内

12-4.取消合并单元格

rng.unmerge()

rng可以是其中的一个是单元格,或者是整个区域

13. 背景色

'获取指定区域的背景色'
rng.color