在以前的文章中,我們介紹了操作Excel的模塊openpyxl的入門知識,相關(guān)文章可以從主頁獲取。接下來我們來學(xué)習(xí)一下openpyxl這個python模塊中的其他知識,本次文章我們來學(xué)習(xí)一下單元格(cell)操作的相關(guān)知識。
1.讀取和設(shè)置單元格內(nèi)容
上篇關(guān)于openpyxl的文章中我們介紹了一些基礎(chǔ)的操作,也包含了讀取和設(shè)置單元格內(nèi)容的操作。我們先復(fù)習(xí)一下,假設(shè)現(xiàn)在有一個“cell_operation.xlsx”文件,文件中的數(shù)據(jù)如下:
我們來進(jìn)行讀取和設(shè)置單元格內(nèi)容的操作:
from openpyxl import *
wb = load_workbook('cell_operation.xlsx')
ws = wb['Sheet1']
cell_value_1 = ws.cell(column=1, row=1).value
set_value_1 = ws.cell(column=1, row=9).value = 8
set_value_2 = ws.cell(column=1, row=10).value = '9'
print('cell_value_1:',cell_value_1)
wb.save('cell_operation.xlsx')
wb.close()
第四行到第六行代碼是讀取和設(shè)置單元格的操作,其中第四行代碼為讀取該單元格的內(nèi)容,第五到第六行代碼是用來設(shè)置單元格內(nèi)容的,運行后Excel文件的結(jié)果如下:
我們可以看到單元格A10中的數(shù)據(jù)是文本格式的,這第五行代碼設(shè)置值的時候是一致的?,F(xiàn)在,我們還有一種方式的進(jìn)行設(shè)置:
ws.cell(column=2, row=9, value="{0}".format(get_column_letter(1)))
這個方式設(shè)置的結(jié)果是B9單元格被設(shè)置了文本“A”。也就是說函數(shù)
get_column_letter將對應(yīng)的數(shù)字轉(zhuǎn)為字母letter,也就是單元格列字母,當(dāng)然還有一種方式也可以進(jìn)行設(shè)置,使用ASCII值進(jìn)行獲取:
letter = chr(i + 65) # 由ASCII值獲得對應(yīng)的列字母
設(shè)置超鏈接:超鏈接設(shè)置也十分常用,比如在C3單元格進(jìn)行設(shè)置一個超鏈接:
ws.cell(3,3).hyperlink = 'www.baidu.com'
接下來我們查看一個單元格常見的屬性值看看:
print(ws.cell(column=2, row=9).column_letter)
print(ws.cell(column=2, row=9).coordinate)
print(ws.cell(column=2, row=9).col_idx)
print(ws.cell(column=2, row=9).encoding)
print(ws.cell(column=2, row=9).offset)
print(ws.cell(column=2, row=9).is_date)
print(ws.cell(column=2, row=9).data_type)
輸出結(jié)果為:
B
B9
2
utf-8
<bound method Cell.offset of >
False
s
上述代碼的輸出我這里就不再進(jìn)行解釋了。輸出的結(jié)果是一些Cell的屬性,除了這些屬性還有一些其他的屬性如:
cell.has_style、cell.style、cell.style_id、cell.font、cell.alignment
cell.border、cell.fill、cell.number_format、cell.hyperlink
具體的這些屬性的實現(xiàn)和意義大家可以在openpyxl中的Cell類中找到相應(yīng)的解釋。
上述就是一些常見的屬性值,大家在工程中沒有找到自己想要的就去源碼類中人去尋找,后面的例子中也會使用到這些屬性值,到時候我們可以在稍介紹一些。
注:在cell的方法中,有一個read_only類。如:
from openpyxl.cell import read_only
s_value = read_only.ReadOnlyCell( 'Sheet1', row=2, column=2, value=3, data_type='n')
print(s_value.value)
print(s_value.internal_value)
很顯然這是只讀模式下使用的,那么上述代碼輸出什么大家自己研究。
2.設(shè)置單元格寬度和高度
在實際的工作中,有時候我們需要對單元格的大小(即高度和寬度進(jìn)行設(shè)置)。那么這個該怎么實現(xiàn)呢?假設(shè)現(xiàn)在我們需要對單元格的寬度和高度進(jìn)行調(diào)整,調(diào)整的方式如下:我們以A1單元格為例:
# 調(diào)整列寬
ws.column_dimensions['A'].width = 20.0
# 調(diào)整行高
ws.row_dimensions[1].height = 40
這種設(shè)置還是非常簡單的也是非常常見的。如果我們需要對不同的單元格進(jìn)行設(shè)置我們使用for循環(huán)就可以了。
那么自適應(yīng)的單元格該怎么設(shè)置呢?
關(guān)于這個自適應(yīng)的單元格size的設(shè)置,本人沒有找到可以直接使用的API,但是想到一個大概的方法:遍歷列,找到最長的字符串,然后據(jù)此設(shè)置列的寬。這里我也正好給大家分享一個http://stackoverflow.com上一位開發(fā)者提供的代碼:
def adjust_column_dimension(ws, min_row, min_col, max_col):
column_widths = []
for i, col in enumerate(ws.iter_cols(min_col=min_col, max_col=max_col, min_row=min_row)):
for cell in col:
value = cell.value
if value is not None:
if isinstance(value, str) is False:
value = str(value)
try:
column_widths[i] = max(column_widths[i], len(value))
except IndexError:
column_widths.append(len(value))
for i, width in enumerate(column_widths):
col_name = get_column_letter(min_col + i)
value = column_widths[i] + 2
ws.column_dimensions[col_name].width = value
# 使用
adjust_column_dimension(ws, 1,1, ws.max_column)
稍微解釋一下代碼里面為什么使用了一個try-except呢?這個問題也比較簡單,那么也留給大家思考咯!
3.合并單元格
合并單元格在日常中也是非常常見的,合并單元格有兩種方式:
ws.merge_cells("A1:B1")
ws.merge_cells(start_column=3,end_column=5,start_row=3,end_row=5)
print(ws.merged_cells)
# A1:B1 C3:E5
print(ws.merged_cell_ranges)
# [<MergedCellRange A1:B1>, <MergedCellRange C3:E5>]
第一行代碼直接使用單元格樣式指出需要合并的單元格,第二行代碼則是使用行列的方式來指明需要合并的單元格,第三行代碼輸出我們已經(jīng)合并的單元格:A1:B1 C3:E5。第四行代碼輸出我們已經(jīng)合并的單元格所組成的列表。
4.單元格樣式設(shè)置
單元格常見的樣式設(shè)置主要為:Font 字體、Side 邊線、Border 邊框、PatternFill 填充、Aignment 對齊的設(shè)置。
假設(shè)我們的數(shù)據(jù)樣例為:
(一)接下來我們來進(jìn)行Font的設(shè)置,代碼如下
from openpyxl import*
from openpyxl.styles import PatternFill, Font, Alignment, Border, Side
wbook = load_workbook("cell_property_sets.xlsx")
wsheet = wbook['Sheet1']
font = Font(name='微軟雅黑',
size=11,
color='FF000000',
bold=True,
italic=True,
vertAlign='baseline',
underline='double',
strike=False)
wsheet['A2'].font = font
wbook.save("cell_property_sets.xlsx")
wbook.close()
設(shè)置后的結(jié)果如下,顯然單元格A2被設(shè)置為我們想要設(shè)置的值,上述代碼的設(shè)置的一些含義或?qū)傩詾椋鹤煮w名稱、字體大小、字體顏色、加粗、斜體、垂直對齊方式、下劃線、刪除線。
(二)接下來我們來進(jìn)行Border和Side的設(shè)置,代碼如下:
from openpyxl import*
from openpyxl.styles import PatternFill, Font, Alignment, Border, Side
wbook = load_workbook("cell_property_sets.xlsx")
wsheet = wbook['Sheet1']
side_type = Side(border_style='mediumDashDot',color='FF000000')
border = Border(left=side_type,
right=side_type,
top=side_type,
bottom=side_type,
diagonal=side_type,
diagonal_direction=30,
outline=side_type,
vertical=side_type,
horizontal=side_type
)
wsheet['A3'].border = border
wbook.save("cell_property_sets.xlsx")
wbook.close()
A3單元格設(shè)置后的樣式如下:
其中屬性值border_style的值在源代碼中給出了以下幾種,大家可以試驗一下,看看設(shè)置不同的值會有什么樣的效果。
(三)接下來我們來進(jìn)行PatternFill填充的設(shè)置,代碼如下:
from openpyxl import*
from openpyxl.styles import PatternFill, Font, Alignment, Border, Side
wbook = load_workbook("cell_property_sets.xlsx")
wsheet = wbook['Sheet1']
fill = PatternFill(fill_type = 'darkDown',start_color='A6DA70D6',end_color='000000')
wsheet['A4'].fill = fill
wbook.save("cell_property_sets.xlsx")
wbook.close()
設(shè)置結(jié)果如下:
這里有一些說明:
首先是參數(shù)fill_type,這個參數(shù)是填充的類型,openpyxl提供了以下幾種屬性。
值的注意的是如果fill_type為None,則后續(xù)的參數(shù)都是不生效的。另外start_color代表前景色,這些顏色都是十六進(jìn)制的aRGB顏色,a代表透明度。如果想要純色填充的話可以就可以使用用fill_type = solid,然后使用前景色就可以了。
為方便大家使用顏色填充,這里對顏色的選擇做出一個小的說明:
首先十六進(jìn)制顏色碼大家可以直接搜索相關(guān)的網(wǎng)站(或百度)就可以獲取到,比如以下這個網(wǎng)頁鏈接:https://www.sioe.cn/yingyong/yanse-rgb-16/
然后透明度怎么設(shè)置呢?這給出一個表:(透明度和對應(yīng)的值,其中100%為完全不透明)
假設(shè)現(xiàn)在我們有一個DA70D6十六進(jìn)制顏色碼,在其頭部拼上一個透明度如B3,則這個aRGB顏色的值為:B3DA70D6。還是很簡單的。
(四)接下來我們來進(jìn)行Aignment 填充的設(shè)置,代碼如下:
from openpyxl import*
from openpyxl.styles import PatternFill, Font, Alignment, Border, Side
wbook = load_workbook("cell_property_sets.xlsx")
wsheet = wbook['Sheet1']
align = Alignment(horizontal='center',vertical='center',text_rotation=0,wrap_text=True,shrink_to_fit=True,indent=0)
wsheet['A6'].alignment = align
wbook.save("cell_property_sets.xlsx")
wbook.close()
參數(shù)說明:
# Horizontal:水平方向,左對齊left,居中center對齊和右對齊right可選。
# Vertical:垂直方向,有居中center,靠上top,靠下bottom,兩端對齊justify等可選。
# text_rotation:文本旋轉(zhuǎn)度。
# wrap_text:自動換行
# Indent:縮進(jìn)。
注:單元格的屬性是可以復(fù)制的,如:
from openpyxl.styles import Font
fsheet1 = Font(name='Arial', size=10)
# 復(fù)制時指定字體為“微軟雅黑”,其他屬性來自fsheet1
fsheet2 = fsheet1.copy(name="微軟雅黑")
(五)接下來我們來進(jìn)行單元格數(shù)字格式設(shè)置,代碼如下:
單元格的數(shù)字格式也是常見的,大家可以在openpyxl中的numbers.py文件中找到數(shù)字的格式,這里貼一些:
from openpyxl import*
from openpyxl.styles import PatternFill, Font, Alignment, Border, Side
wbook = load_workbook("cell_property_sets.xlsx")
wsheet = wbook['Sheet1']
wsheet['A9'].number_format = 'd-mmm-yy'
wbook.save("cell_property_sets.xlsx")
wbook.close()
設(shè)置后的結(jié)果如下:
5.總結(jié)
以上就是本次的文章,介紹的內(nèi)容比較簡單,大家跟著學(xué)習(xí)的時候最好也跟著實踐一下。后期我們將繼續(xù)介紹其他方面的知識。比如在Excel中使用公式,進(jìn)行表格的數(shù)據(jù)的過濾等操作。大家在學(xué)習(xí)的時候有什么疑問,也歡迎在評論區(qū)留言。