全网最详细的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