参考一篇写的比较好的博客:https://www.cnblogs.com/sun-haiyu/p/7096423.html
为了读取数据,我们首先先写一个excel,写的时候,每一行添加随机数10个,从0~9,并且使用红色加粗标记大于5的数字,实现代码如下
import random
from openpyxl import Workbook,load_workbook
from openpyxl.styles import Font,colors
def make_random(limit,rand_range):
'''
在limit范围内生成指定数量的随机数
'''
return [random.randrange(rand_range) for i in range(limit)]
def make_alpha_dict():
'''
生成26个字母与数字的对应
'''
foo_dict = {}
for i in range(26):
foo_dict[i+1] = chr(97+i)
return foo_dict
#写入一个excel
book = Workbook()
sheet1 = book.active
sheet1.title = 'test'
alpha_dict = make_alpha_dict()
for i in range(10):
random_list= list(make_random(10,10))
sheet1.append(random_list)
mark_index = [ i for i,j in enumerate(random_list) if j > 5]
for idx in mark_index:
sheet1['{}{}'.format(alpha_dict[idx+1],i+1)].font = Font(color=colors.RED,bold=True)
#易错点:在excel表格中行是从1开始的,而不是从0开始的
sheet2 = book.create_sheet(title='sheet2')
book.save('test.xlsx')
以上代码存在一个漏洞,就是那个生成26个字母与数字对应的函数,因为在excel表格中,超过26列之后将以AA开始,因此最好的解决办法是导入 如下函数
from openpyxl.utils import get_column_letter
print(get_column_letter(1)) # A
print(get_column_letter(27) # AA
与之相反的是从字符转换为数字
from openpyxl.utils import column_index_from_string
column_index_from_string('D') # 4
接下来是读取这个写好的workbook
book = load_workbook('test.xlsx')
sheet_names = book.get_sheet_names()
print('sheet_names:{}'.format(sheet_names))
print(book['test'])
sheet1 = book[sheet_names[0]]
print(sheet1.title)
for row in sheet1.rows:
print(list(row))
print([cell.value for cell in row])
for col in sheet1.columns:
print(list(col))
#这里的cell是从1开始的,以下代码代表A1
print(sheet1.cell(row=1,column=1))
读取的时候使用load_workbook(),可以通过指定read_only使其仅能被读取,不能被修改。否则,默认情况下为读写模式
需要注意的是,在只读模式下将不能使用sheet.columns属性
AttributeError: 'ReadOnlyWorksheet' object has no attribute 'columns'
读取具体某个sheet的时候,使用book['sheetname']的方式来获取,不知道sheetname的情况下,使用book.sheetnames属性来获取一个列表因此可以使用book[book.sheetnames[0]]来获取第一个sheet。