工作表对象是单元格对象的父对象,它是对现实办公场景中工作表单据的抽象和模拟。使用工作表对象提供的属性和方法,可以通过编程的方式控制和操作工作表。[大谦Excel,dqexcel点com]
创建和删除工作表
使用工作簿对象的create_sheet方法创建新的工作表,该方法的语法格式为:
ws=wb.create_sheet(title=None, index=None)
其中,title为字符串,表示新工作表的名称,index为整数,表示新工作表插入的位置,两个参数都是可选项。该函数返回一个工作表对象,该工作表自动成为当前活动工作表。
下面用无参的create_sheet方法创建一个新工作表。该工作表放在当前所有工作表的后面,工作表的名称为Sheet后面跟一个数字,如Sheet1。如果继续添加,名称后面的数字连续累加。
>>> ws0 = wb.create_sheet()
也可以指定title参数的值,创建指定名称的工作表。下面创建一个名为Mysheet的新工作表。
>>> ws1 = wb.create_sheet("Mysheet")
默认时创建的新工作表是放在最后面的,指定index参数的值,可以指定新工作表的插入位置。下面设置index参数的值为0,把新工作表放在最前面。
>>> ws2 = wb.create_sheet("Mysheet", 0)
index的值为负时,表示从后向前编号。比如下面将index的值设置为-1,表示在倒数第二的位置插入新工作表。
>>> ws3 = wb.create_sheet("Mysheet", -1)
创建工作簿时会自动添加一个名为Sheet的工作表。最后添加的工作表自动成为活动工作表。使用工作簿对象的active属性可以获取活动工作表。
>>> wb = Workbook()
>>> ws = wb.active
>>> ws.title
'Sheet'
使用工作簿对象的remove方法删除指定工作表。下面从工作簿中删除工作表ws1。
>>> wb.remove(ws1)
也可以使用del命令删除工作表:
>>> del wb[ws1.title]
工作表的管理
创建工作表以后,需要进行管理。一般用集合进行管理,新创建的工作表worksheet对象,会自动添加到集合worksheets中,通过索引或遍历,可以把需要操作的对象从集合中提取出来,也可以把对象从集合中删除。
使用workbook对象的create_sheet方法,创建新的worksheet对象,并添加到集合worksheets中。按照添加的顺序,每个对象自动获得一个索引号。索引号的基数为0。
>>> wb.create_sheet()
用workbook对象的worksheets属性获取集合worksheets。利用索引号,可以访问获取对应的worksheet对象,以备进一步操作。
>>> sheets=wb.worksheets
>>> sheets[0].title
'Sheet'
>>> sheets[1].title
'MySheet'
上面获取当前工作簿中前两个工作表对象,输出它们的标题。
上面sheets变量是一个包含所有worksheet对象的列表,使用len函数可以获得集合中worksheet对象的个数。
>>> sheets
[<Worksheet "Sheet">, <Worksheet "Sheet1">]
>>> len(sheets)
2
使用workbook对象的remove方法,可以把指定对象从集合中删除。
>>> wb.remove(ws)
重新查看集合中对象的个数:
>>> sheets=wb.worksheets
>>> len(sheets)
1
如果不知道要处理对象的索引号,或者要对集合中所有对象进行处理,可以使用for循环。
>>> for sheet in wb:
print(sheet.title)
这里输出集合中所有工作表对象的名称。
工作表的引用
工作表的引用,指的是将需要处理的工作表从集合中找出来,以备后面的操作。获取集合对象以后,可以使用工作表的索引号或名称进行引用。
>>> sheets=wb.worksheets
使用索引号引用工作表:
>>> ws=sheets[0]
>>> ws.title
'Sheet'
使用名称引用工作表:
>>> ws2 = wb["Sheet"]
使用工作簿对象的get_sheet_by_name方法也可以引用工作表。
>>> ws3 = wb.get_sheet_by_name("Sheet")
如果不知道工作表的名称,只知道工作表的索引号,可以先用工作簿对象的sheetnames属性获取工作簿中所有工作表的名称,根据索引号得到对应工作表的名称,然后利用该名称引用工作表。
>>> names = wb.sheetnames
>>> ws4 = wb[names[0]]
复制、移动工作表
使用工作簿对象的copy_worksheet方法复制工作表。
>>> 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 ",再按添加的顺序添加累加的整数数字。
可以修改工作表的名称。
>>> copy_sheet1.title="NewSheet"
注意:使用copy_worksheet方法,只能将源工作表复制到本工作簿,不能复制到其他工作簿。
图3-1 复制工作表
移动工作表,即剪切工作表,将源工作表复制到新位置后,删除源工作表。使用工作簿对象的move_worksheet方法移动工作表。
>>> wb.move_sheet(ws, offset=1)
该方法有两个参数。第一个参数为要移动的工作表,第二个参数表示移动的位置。当第二个参数的值大于0时,表示源工作表向右侧移动指定个数的位置,值小于0时,表示向左侧移动。
行/列操作
工作表中行和列的操作包括行和列的增加、插入、删除以及引用和遍历等。
一、新增行
使用工作表对象的append方法在当前工作表的底部增加一行数据。该方法的语法格式为:
ws.append(iterable)
其中,iterable为一可迭代对象,必须是list,tuple,dict,range,generator类型中的一种。 如果是list, 将list中的元素按先后顺序逐个添加到该行的单元格中。如果是dict, 按照相应的键添加相应的值。
下面在ws工作表底部添加两行列表数据:
>>> ws.append([10, 8, 21])
>>> ws.append(["唐云", 39, 65])
添加字典数据
>>> ws.append({"A":"李广", "B":90, "C":87})
>>> ws.append({1: "孙琦", 2:83, 3:79})
添加列表和字典行数据后的效果如图3-2所示。
图3-2 添加列表和字典行数据
可以使用循环连续添加行数据:
>>> for row in range(1, 10):
ws.append(range(10,20))
二、获取行、列或多行、多列
获取行和列,即引用行和列。使用行号引用行,使用列对应的字母引用列。下面获取第10行和第3列。
>>> row10 = ws[10]
>>> colC = ws["C"]
多行和多列的引用语法如下所示:
>>> rows1 = ws[5:10]
>>> rows2 = ws[1 3 6]
>>> cols1 = ws["C:D"]
>>> cols2 = ws["A C D"]
三、遍历行或列
使用for循环,可以遍历单行单列或多行多列,获取工作表中的数据。下面用for循环遍历第一行和第一列,并输出其中各单元格中的数据。
>>> for cell in ws["1"]: #遍历第一行的每个单元格
print(cell.value)
>>> for cell in ws["A"]: #遍历第一列的每个单元格
print(cell.value)
下面用嵌套的for循环遍历第一至三行和第一至三列,并输出其中各单元格中的数据。
>>> for row in ws["1:3"]: #遍历第一至三行
for cell in row: #遍历各行的单元格
print(cell.value)
>>> for column in ws["A:C"]: #遍历第一至三列
for cell in column: #遍历各列的单元格
print(cell.value)
四、遍历区域数据
对于指定的区域,也可以使用for循环,通过遍历获取区域内各单元格的数据。下面用嵌套的for循环遍历A1:C3区域,输出各单元格中的数据。
>>> for row in ws["A1:C3"]: #遍历区域内的行
for cell in row: #遍历区域内各行的单元格
print(cell.value)
下面的代码将指定区域内的数据保存到列表data中,并输出数据。
>>> 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。
>>> wb=load_workbook("test.xlsx")
>>> ws=wb.active
>>> [ws.min_row,ws.max_row,ws.min_column,ws.max_column]
[3, 9, 3, 7]
图3-3 获取工作表中区域的边界
使用工作表对象的iter_rows和iter_cols方法,也可以遍历指定区域内的行和列。这两个方法的参数都是min_row, max_row,min_column和max_column四个参数,它们的默认值都是1。所以,不给它们赋值时,其值取1。
下面用工作表对象的iter_rows方法遍历指定区域内的行:
>>> for row in ws.iter_rows(min_row=3, max_col=4, max_row=5):
line = [cell.value for cell in row]
print(line)
输出结果为:
[None, None, '李广', 90]
[None, None, '孙琦', 83]
[None, None, 10, 8]
因为没有给min_col参数赋值,它取默认值1,前两列的值为空。
用工作表对象的iter_cols方法遍历指定区域内的列:
>>> for col in ws.iter_cols(min_row=3, max_col=4, max_row=5):
line = [cell.value for cell in col]
print(line)
输出结果为:
[None, None, None]
[None, None, None]
['李广', '孙琦', 10]
[90, 83, 8]
五、遍历所有行或列
遍历工作表中的所有行,使用工作表对象的rows属性:
>>> for row in ws.rows:
line = [cell.value for cell in row]
print(line)
输出结果为:
[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属性:
>>> for column in ws.columns:
line = [cell.value for cell in column]
print(line)
输出结果为:
[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属性返回各行的数据。
>>> for row in ws.values:
print(row)
以列表的形式输出每行的数据:
>>> for row in ws.values:
print(list(row))
六、插入和删除行/列
使用工作表对象的insert_rows方法插入1行或多行:
>>> ws.insert_rows(5)
如图3-4所示,在第5行上面插入1个空行。
使用下面的代码,在第5行上面插入3个空行。
>>> ws.insert_rows(5,3)
图3-4 插入行
使用工作表对象的insert_cols方法,可以进行插入列的操作。下面在第4列左侧插入1列。
>>> ws.insert_cols(4)
在第4列左侧插入3列。
>>> ws.insert_cols(4,3)
使用delete_rows和delete_cols方法删除行和列。下面在ws工作表中删除第5行和第4列。
>>> ws.delete_rows(5)
>>> ws.delete_cols(4)
下面从第5行开始,连续删除3行(包含第5行);从第4列开始,连续删除3列(包含第4列)。
>>> 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。
>>> ws.row_dimensions[2].height = 20
将C列的宽度设置为35。
>>> ws.column_dimensions["C"].width = 35
设置效果如图3-5所示。
图3-5 改变行高和列宽
工作表的其他属性和方法
下面介绍工作表对象的其他一些成员。[大谦Excel,dqexcel点com]
>>> 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'