參考一篇寫的比較好的博客: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。