工作表

工作表对象是单元格对象的父对象,它是对现实办公场景中工作表单据的抽象和模拟。使用工作表对象提供的属性和方法,可以通过编程的方式控制和操作工作表。[大谦Excel,dqexcel点com]

创建和删除工作表

使用工作簿对象的create_sheet方法创建新的工作表,该方法的语法格式为:

code.python
ws=wb.create_sheet(title=None, index=None)

其中,title为字符串,表示新工作表的名称,index为整数,表示新工作表插入的位置,两个参数都是可选项。该函数返回一个工作表对象,该工作表自动成为当前活动工作表。

下面用无参的create_sheet方法创建一个新工作表。该工作表放在当前所有工作表的后面,工作表的名称为Sheet后面跟一个数字,如Sheet1。如果继续添加,名称后面的数字连续累加。

code.python
>>> ws0 = wb.create_sheet()

也可以指定title参数的值,创建指定名称的工作表。下面创建一个名为Mysheet的新工作表。

code.python
>>> ws1 = wb.create_sheet("Mysheet")

默认时创建的新工作表是放在最后面的,指定index参数的值,可以指定新工作表的插入位置。下面设置index参数的值为0,把新工作表放在最前面。

code.python
>>> ws2 = wb.create_sheet("Mysheet", 0)

index的值为负时,表示从后向前编号。比如下面将index的值设置为-1,表示在倒数第二的位置插入新工作表。

code.python
>>> ws3 = wb.create_sheet("Mysheet", -1)

创建工作簿时会自动添加一个名为Sheet的工作表。最后添加的工作表自动成为活动工作表。使用工作簿对象的active属性可以获取活动工作表。

code.python
>>> wb = Workbook()
>>> ws = wb.active
>>> ws.title
'Sheet'

使用工作簿对象的remove方法删除指定工作表。下面从工作簿中删除工作表ws1。

code.python
>>> wb.remove(ws1)

也可以使用del命令删除工作表:

code.python
>>> del wb[ws1.title]

工作表的管理

创建工作表以后,需要进行管理。一般用集合进行管理,新创建的工作表worksheet对象,会自动添加到集合worksheets中,通过索引或遍历,可以把需要操作的对象从集合中提取出来,也可以把对象从集合中删除。

使用workbook对象的create_sheet方法,创建新的worksheet对象,并添加到集合worksheets中。按照添加的顺序,每个对象自动获得一个索引号。索引号的基数为0。

code.python
>>> wb.create_sheet()

用workbook对象的worksheets属性获取集合worksheets。利用索引号,可以访问获取对应的worksheet对象,以备进一步操作。

code.python
>>> sheets=wb.worksheets
>>> sheets[0].title
'Sheet'
>>> sheets[1].title
'MySheet'

上面获取当前工作簿中前两个工作表对象,输出它们的标题。

上面sheets变量是一个包含所有worksheet对象的列表,使用len函数可以获得集合中worksheet对象的个数。

code.python
>>> sheets
[<Worksheet "Sheet">, <Worksheet "Sheet1">]
>>> len(sheets)
2

使用workbook对象的remove方法,可以把指定对象从集合中删除。

code.python
>>> wb.remove(ws)

重新查看集合中对象的个数:

code.python
>>> sheets=wb.worksheets
>>> len(sheets)
1

如果不知道要处理对象的索引号,或者要对集合中所有对象进行处理,可以使用for循环。

code.python
>>> for sheet in wb:
print(sheet.title)

这里输出集合中所有工作表对象的名称。

工作表的引用

工作表的引用,指的是将需要处理的工作表从集合中找出来,以备后面的操作。获取集合对象以后,可以使用工作表的索引号或名称进行引用。

code.python
>>> sheets=wb.worksheets

使用索引号引用工作表:

code.python
>>> ws=sheets[0]
>>> ws.title
'Sheet'

使用名称引用工作表:

code.python
>>> ws2 = wb["Sheet"]

使用工作簿对象的get_sheet_by_name方法也可以引用工作表。

code.python
>>> ws3 = wb.get_sheet_by_name("Sheet")

如果不知道工作表的名称,只知道工作表的索引号,可以先用工作簿对象的sheetnames属性获取工作簿中所有工作表的名称,根据索引号得到对应工作表的名称,然后利用该名称引用工作表。

code.python
>>> names = wb.sheetnames
>>> ws4 = wb[names[0]]

复制、移动工作表

使用工作簿对象的copy_worksheet方法复制工作表。

code.python
>>> from openpyxl import Workbook
>>> wb = Workbook()
>>> ws=wb.active
>>> copy_sheet1=wb.copy_worksheet(ws)
>>> copy_sheet2=wb.copy_worksheet(ws)
>>> wb.save("test.xlsx")

打开test.xlsx文件后,效果如图3-1所示。

可见,复制后得到的源工作表的拷贝被依次放在所有工作表的后面,新工作表的名称为源工作表的名称后面添加"Copy ",再按添加的顺序添加累加的整数数字。

可以修改工作表的名称。

code.python
>>> copy_sheet1.title="NewSheet"

注意:使用copy_worksheet方法,只能将源工作表复制到本工作簿,不能复制到其他工作簿。

Document Image

图3-1 复制工作表

移动工作表,即剪切工作表,将源工作表复制到新位置后,删除源工作表。使用工作簿对象的move_worksheet方法移动工作表。

code.python
>>> wb.move_sheet(ws, offset=1)

该方法有两个参数。第一个参数为要移动的工作表,第二个参数表示移动的位置。当第二个参数的值大于0时,表示源工作表向右侧移动指定个数的位置,值小于0时,表示向左侧移动。

行/列操作

工作表中行和列的操作包括行和列的增加、插入、删除以及引用和遍历等。

一、新增行

使用工作表对象的append方法在当前工作表的底部增加一行数据。该方法的语法格式为:

code.python
ws.append(iterable)

其中,iterable为一可迭代对象,必须是list,tuple,dict,range,generator类型中的一种。 如果是list, 将list中的元素按先后顺序逐个添加到该行的单元格中。如果是dict, 按照相应的键添加相应的值。

下面在ws工作表底部添加两行列表数据:

code.python
>>> ws.append([10, 8, 21])
>>> ws.append(["唐云", 39, 65])

添加字典数据

code.python
>>> ws.append({"A":"李广", "B":90, "C":87})
>>> ws.append({1: "孙琦", 2:83, 3:79})

添加列表和字典行数据后的效果如图3-2所示。

Document Image

图3-2 添加列表和字典行数据

可以使用循环连续添加行数据:

code.python
>>> for row in range(1, 10):
	    ws.append(range(10,20))

二、获取行、列或多行、多列

获取行和列,即引用行和列。使用行号引用行,使用列对应的字母引用列。下面获取第10行和第3列。

code.python
>>> row10 = ws[10]
>>> colC = ws["C"]

多行和多列的引用语法如下所示:

code.python
>>> rows1 = ws[5:10]
>>> rows2 = ws[1 3 6]
>>> cols1 = ws["C:D"]
>>> cols2 = ws["A C D"]

三、遍历行或列

使用for循环,可以遍历单行单列或多行多列,获取工作表中的数据。下面用for循环遍历第一行和第一列,并输出其中各单元格中的数据。

code.python
>>> for cell in ws["1&quot;]:   #遍历第一行的每个单元格
    	print(cell.value)
>>> for cell in ws["A&quot;]:   #遍历第一列的每个单元格
    	print(cell.value)

下面用嵌套的for循环遍历第一至三行和第一至三列,并输出其中各单元格中的数据。

code.python
>>> for row in ws["1:3&quot;]:   #遍历第一至三行
    	for cell in row:      #遍历各行的单元格
        	print(cell.value)
>>> for column in ws["A:C&quot;]:   #遍历第一至三列
    	for cell in column:      #遍历各列的单元格
        	print(cell.value)

四、遍历区域数据

对于指定的区域,也可以使用for循环,通过遍历获取区域内各单元格的数据。下面用嵌套的for循环遍历A1:C3区域,输出各单元格中的数据。

code.python
>>> for row in ws["A1:C3&quot;]:   #遍历区域内的行
    	for cell in row:    #遍历区域内各行的单元格
        	print(cell.value)

下面的代码将指定区域内的数据保存到列表data中,并输出数据。

code.python
>>> data = []
>>> for row in ws["A1:C3"]:
   		rv = []
   		for cell in row:
       		rv.append(cell.value)
   		data.append(rv)
>>> print(data)

利用工作表对象提供的属性,可以获取包含工作表中所有数据的最小区域。这几个属性是:

• min_row: 该最小区域的最小行号

• min_column: 该最小区域的最小列号

• max_row: 该最小区域的最大行号

• max_column: 该最小区域的最大列号

例如,对于图3-3中所示的工作表Sheet,包含所有数据的最小区域范围为min_row=3, max_row=9,min_column=3,max_column=7。

code.python
>>> wb=load_workbook("test.xlsx")
>>> ws=wb.active
>>> [ws.min_row,ws.max_row,ws.min_column,ws.max_column]
[3, 9, 3, 7]
Document Image

图3-3 获取工作表中区域的边界

使用工作表对象的iter_rows和iter_cols方法,也可以遍历指定区域内的行和列。这两个方法的参数都是min_row, max_row,min_column和max_column四个参数,它们的默认值都是1。所以,不给它们赋值时,其值取1。

下面用工作表对象的iter_rows方法遍历指定区域内的行:

code.python
>>> for row in ws.iter_rows(min_row=3, max_col=4, max_row=5):
		line = [cell.value for cell in row]
		print(line)

输出结果为:

code.python
[None, None, '李广', 90]
[None, None, '孙琦', 83]
[None, None, 10, 8]

因为没有给min_col参数赋值,它取默认值1,前两列的值为空。

用工作表对象的iter_cols方法遍历指定区域内的列:

code.python
>>> for col in ws.iter_cols(min_row=3, max_col=4, max_row=5):
		line = [cell.value for cell in col]
		print(line)

输出结果为:

code.python
[None, None, None]
[None, None, None]
['李广', '孙琦', 10]
[90, 83, 8]

五、遍历所有行或列

遍历工作表中的所有行,使用工作表对象的rows属性:

code.python
>>> for row in ws.rows:
		line = [cell.value for cell in row]
		print(line)

输出结果为:

code.python
[None, None, None, None, None, None, None]
[None, None, None, None, None, None, None]
[None, None, '李广', 90, 87, None, None]
[None, None, '孙琦', 83, 79, None, None]
[None, None, 10, 8, 21, None, None]
[None, None, '唐云', 39, 65, None, None]
[None, None, '李广', 90, 87, None, None]
[None, None, '孙琦', 83, 79, None, None]
[None, None, None, None, None, None, None]
[None, None, None, None, None, None, 78]

可见,这里取的区域,左上角的单元格为A1。

遍历工作表中的所有列,使用工作表对象的columns属性:

code.python
>>> for column in ws.columns:
		line = [cell.value for cell in column]
		print(line)

输出结果为:

code.python
[None, None, None, None, None, None, None, None, None, None]
[None, None, None, None, None, None, None, None, None, None]
[None, None, '李广', '孙琦', 10, '唐云', '李广', '孙琦', None, None]
[None, None, 90, 83, 8, 39, 90, 83, None, None]
[None, None, 87, 79, 21, 65, 87, 79, None, None]
[None, None, None, None, None, None, None, None, None, None]
[None, None, None, None, None, None, None, None, None, 78]

工作表对象的values属性返回各行的数据。

code.python
>>> for row in ws.values:
		print(row)

以列表的形式输出每行的数据:

code.python
>>> for row in ws.values:
		print(list(row))

六、插入和删除行/列

使用工作表对象的insert_rows方法插入1行或多行:

code.python
>>> ws.insert_rows(5)

如图3-4所示,在第5行上面插入1个空行。

使用下面的代码,在第5行上面插入3个空行。

code.python
>>> ws.insert_rows(5,3)
Document Image

图3-4 插入行

使用工作表对象的insert_cols方法,可以进行插入列的操作。下面在第4列左侧插入1列。

code.python
>>> ws.insert_cols(4)

在第4列左侧插入3列。

code.python
>>> ws.insert_cols(4,3)

使用delete_rows和delete_cols方法删除行和列。下面在ws工作表中删除第5行和第4列。

code.python
>>> ws.delete_rows(5)
>>> ws.delete_cols(4)

下面从第5行开始,连续删除3行(包含第5行);从第4列开始,连续删除3列(包含第4列)。

code.python
>>> ws.delete_rows(5,3)
>>> ws.delete_cols(4,3)

七、改变行高和列宽

工作表对象的row_dimensions和column_dimensions属性表示行维和列维,用索引号指定某行或某列。如ws.row_dimension[2]表示第2行,column_dimensions["C"]表示C列。使用它们的height属性或width属性设置或获取行高或列宽。

下面将ws工作表中第2行的高度设置为20。

code.python
>>> ws.row_dimensions[2].height = 20

将C列的宽度设置为35。

code.python
>>> ws.column_dimensions["C"].width = 35

设置效果如图3-5所示。

Document Image

图3-5 改变行高和列宽

工作表的其他属性和方法

下面介绍工作表对象的其他一些成员。[大谦Excel,dqexcel点com]

code.python
>>> ws.title   #工作表的名称
'Sheet'
>>> ws.sheet_state   #可见状态
'visible'
>>> ws.dimensions  #表格中含有数据的部分的大小
'A2:G10'
>>> ws.sheet_properties  #工作表相关属性,包括tabColor,tagname等
<openpyxl.worksheet.properties.WorksheetProperties object>
Parameters:
codeName=None, enableFormatConditionsCalculation=None, filterMode=None,
published=None, syncHorizontal=None, syncRef=None, syncVertical=None,
transitionEvaluation=None, transitionEntry=None,
tabColor=<openpyxl.styles.colors.Color object>
Parameters:
rgb='00FFFFFF', indexed=None, auto=None, theme=None, tint=0.0, type='rgb',
outlinePr=<openpyxl.worksheet.properties.Outline object>
Parameters:
applyStyles=None, summaryBelow=True, summaryRight=True,
showOutlineSymbols=None, pageSetUpPr=
<openpyxl.worksheet.properties.PageSetupProperties object>
Parameters:
autoPageBreaks=None, fitToPage=None
>>> ws.sheet_properties.tabColor='FF0000'   #设置选项卡标签处的背景色
>>> ws.active_cell     #活动单元格
'C9'
>>> ws.selected_cell    #选中的单元格
'C9'