使用openpyxl讀取數據

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章