2. 操作工作表
前面提到一个工作簿中会有一个或者多个工作表,当前使用的工作表被称作活动工作表,这里展开介绍一下对于工作表的一些操作。
2.1 枚举所有工作表
使用for循环可以很方便的遍历每个工作表:
import openpyxl
wb = openpyxl.open('./test.xlsx')
for sheet in wb:print(sheet.title)
wb.close()
另外一种方式是使用工作簿的sheetnames属性,该属性返回一个列表,包含了所有工作表的名称。
import openpyxl
wb = openpyxl.open('./test.xlsx')
print(wb.sheetnames)
wb.close()
2.2 创建工作表
在工作簿中可以使用create_sheet创建工作表,例如:
import openpyxl
wb = openpyxl.open('./test.xlsx')
ws=wb.create_sheet('new_sheet')
print(wb.sheetnames)
wb.save('./test.xlsx')
wb.close()
有趣的问题:如果创建两个同名工作簿呢?
import openpyxl
wb = openpyxl.open('./test.xlsx')
ws=wb.create_sheet('dumplicate_sheet')
ws=wb.create_sheet('dumplicate_sheet')
print(wb.sheetnames)
wb.save('./test.xlsx')
wb.close()
执行这个脚本的效果是:
['by_python', 'dumplicate_sheet', 'dumplicate_sheet1']
可以看到,对于同名的工作表,会在后面加上数字。
2.3 复制工作表
有时,我们创建的工作表,可以作为一个模版文件,生成多个同样的工作表。可以使用工作簿的copy_worksheet函数,以某个工作表作为模版创建新的工作表:
import openpyxl
wb = openpyxl.open('./test.xlsx')
ws = wb['by_python']
for i in range(1, 6):new_sheet = wb.copy_worksheet(ws)new_sheet.title='new_sheet'+str(i)
wb.save('./test.xlsx')
wb.close()
运行脚本效果如下:
可以看到,创建了5个新的工作表,每个工作表的A1单元格和by_python工作表的A1单元格内容是相同的。
2.4 删除工作表
使用工作簿的remove函数删除工作表,注意删除以后需要保存才能生效。
import openpyxl
wb = openpyxl.open('./test.xlsx')
#suppose we want to delete the sheet named 'dumplicate_sheet1'
wb.remove(wb['dumplicate_sheet1'])
wb.save('./test.xlsx')
wb.close()
注意:如果试图删除一个工作簿中不存在的工作表,会产生异常,例如:
import openpyxl
wb = openpyxl.open('./test.xlsx')
wb.remove(wb['not_exist_sheet'])
wb.save('./test.xlsx')
wb.close()
会产生异常:
KeyError: 'Worksheet Sheet2 does not exist.'
不能删除当前的工作表,例如:
import openpyxl
wb = openpyxl.open('./test.xlsx')
wb.remove(wb.active.title)
wb.save('./test.xlsx')
wb.close()
会产生异常:
ValueError: 'by_python' is not in list
虽然用wb.sheetnames可以看到该工作表在工作簿中,但是值异常显示不在列表中,因此,工作簿中至少要有一个工作表。
2.5 获取工作表对象
使用工作簿的get_sheet_by_name函数可以获得一个工作表对象:
import openpyxl
wb = openpyxl.open('./test.xlsx')
ws=wb.get_sheet_by_name('by_python')
ws['A1'].value='test'
wb.save('./test.xlsx')
wb.close()
运行效果如下:
不过这种方式过时了,代码会警告:
DeprecationWarning: Call to deprecated function get_sheet_by_name (Use wb[sheetname]).
ws=wb.get_sheet_by_name('by_python')
更简单便捷的方式是使用索引:
import openpyxl
wb = openpyxl.open('./test.xlsx')
ws=wb['by_python']
ws['A1'].value='test'
wb.save('./test.xlsx')
wb.close()
2.6 修改工作表的颜色
工作表的一些属性,可以通过properties设置,例如修改工作表的颜色:
import openpyxl
from openpyxl.styles import Color
wb = openpyxl.open('./test.xlsx')
ws=wb.create_sheet('color_sheet')
ws.sheet_properties.tabColor = "FF0000"
wb.save('./test.xlsx')
wb.close()
可以看到工作表颜色变成了红色。
2.7 隐藏和显示工作表
以刚才创建的工作表为例,将其隐藏:
import openpyxl
wb = openpyxl.open('./test.xlsx')
ws=wb['color_sheet']
ws.sheet_state = 'hidden'
wb.save('./test.xlsx')
wb.close()
使用Excel打开工作表,可以看到下方并没有显示该工作表,在任何一个工作表上单击右键,选择取消隐藏,就可以看到被脚本隐藏的工作表了:
另外两个可选的参数是“visible”和“veryhidden”,前者设置工作表可见,而后者设置为深度隐藏,在这种情况下,使用Excel就无法使其显示出来了。