openpyxl 是一個(gè)用于處理 xlsx 格式 Excel 表格文件的第三方 python 庫,其支持 Excel 表格絕大多數(shù)基本操作。
安裝方法
使用 pip 或通過專門 python IDE(如pyCharm)進(jìn)行安裝
其中pip安裝方法,命令行輸入: pip install openpyxl
基本使用
第一步先是要導(dǎo)入 openpyxl 模塊
import openpyxl
讀取Excel文檔
通過調(diào)用方法 load_workbook(filename) 進(jìn)行文件讀取,該方法中還有一個(gè) read_only 參數(shù)用于設(shè)置文件打開方式,默認(rèn)為可讀可寫,該方法最終將返回一個(gè) workbook 的數(shù)據(jù)對(duì)象
# 文件必須是xlsx格式,如果是其他格式在執(zhí)行前可利用win32輔助轉(zhuǎn)化
wb = openpyxl.load_workbook(‘example.xlsx’)
(一)獲取工作表
每一個(gè) Excel 表格中都會(huì)有很多張 sheet 工作表,在對(duì)表格操作前需要先選定一張工作表
# 獲取所有工作表名(返回一個(gè)列表)
sheets = wb.get_sheet_names()
# 獲取某一特定的工作表
sheet = wb.get_sheet_by_name('Sheet2')
# 獲取工作表的表名
sheet_name = sheet.title
# 一般來說,表格大多數(shù)用到的是打開時(shí)顯示的工作表,這時(shí)可以用active來獲取當(dāng)前工作表
sheet = wb.active
(二)獲取單元格
對(duì) Excel 表格的操作最終都落于對(duì)單元格的操作,獲取單元格有兩種獲取方法:sheet[列行名]和 sheet.cell(row,column)
# 通過sheet[列行名]獲取
a = sheet['A2']
# 通過sheet.cell(row,column)獲取
b = sheet.cell(1, 2) # 即sheet['B1']
# 獲取單元格內(nèi)容
print(a.value)
# 獲取單元格所在列和行
print(‘a(chǎn) is ’+str((a.column,a.row)))
需要注意的是,sheet.cell(row,column)中參數(shù)分別是行和列,且必須為整數(shù),如果列為英文字母,可以利用 openpyxl.utils 中的 column_index_from_string (char)進(jìn)行字母數(shù)字的轉(zhuǎn)化。順便一說,同理也可以利用 get_column_letter(number) 進(jìn)行數(shù)字字母間的轉(zhuǎn)化
from openpyxl.utils import get_column_letter, column_index_from_string
# 對(duì)列進(jìn)行字母/數(shù)字轉(zhuǎn)化
c_num = column_index_from_string('B') # c_num = 2
c_char = get_column_letter(5) # c_char = 'E‘
(三)獲取行和列
在處理 Excel 表格有時(shí)可能需要對(duì)表格進(jìn)行遍歷查找,openpyxl 中便提供了一個(gè)行和列的生成器 (sheet.rows和sheet.columns) ,這兩個(gè)生成器里面是每一行(或列)的數(shù)據(jù),每一行(或列)又由一個(gè) tuple 包裹,借此可以很方便地完成對(duì)行和列的遍歷
# 對(duì)行進(jìn)行遍歷,輸出A1,B1,C1
for row in sheet.rows:
for cell in row:
print(cell.value)
# 對(duì)列進(jìn)行遍歷,輸出A1,A2,A3
for column in sheet.columns:
for cell in column:
print(cell.value)
學(xué)習(xí)時(shí)還發(fā)現(xiàn)也可以通過 list(sheet.rows)index 對(duì)某一行或列進(jìn)行遍歷,而在此值得注意的是,由于sheet.rows(或sheet.columns)
是生成器類型,是不能直接調(diào)用的,需將其轉(zhuǎn)化為一個(gè) list 類型,然后再通過索引遍歷
# 對(duì)某一特定的行進(jìn)行遍歷
for cell in list(sheet.rows)[0]:
print(cell.value)
同時(shí),也可以通過使用 sheet[行列值:行列值] 來對(duì)給定單元格范圍進(jìn)行遍歷
# 對(duì)某一單元格范圍進(jìn)行遍歷
for spaces in sheet['A1':'B2']:
for cell in spaces:
print(cell.value)
另外,有時(shí)候我們還可能需要確定表格的大小,即獲取表格行和列的最大值,可以用 max_row 和 max_column 來獲取
# 獲得最大列和最大行
print(sheet.max_row)
print(sheet.max_column)
寫入Excel文檔
在開頭讀取時(shí)已經(jīng)介紹,默認(rèn)的打開方式為可讀可寫,那么使用 load_workbook(filename) 讀取 Excel 文檔后也就可以直接寫入了。另外,如果需要新建一個(gè) Excel 文件,可以使用 Workbook()方法,同時(shí)它會(huì)自動(dòng)提供一個(gè) sheet 工作表。對(duì)于刪除一個(gè)工作表,則可以使用 workbook 對(duì)象的 remove(sheet) 方法刪除
# 新建一個(gè)Excel文檔
wb = openpyxl.Workbook()
# 刪除某個(gè)工作表
wb.remove(sheet)
(一)寫入單元格
獲取工作表和之前一樣,如果使用 load_workbook(filename) 讀取,那么獲取工作表后可以直接通過sheet[行列值]寫入單元格。學(xué)習(xí)時(shí),有資料介紹還可以傳入Excel中的公式進(jìn)行賦值,不過要注意,在讀取文件時(shí)需要加上參數(shù) data_only=True ,這樣才能返回?cái)?shù)字,否則將返回字符串,即公式本身
# 直接賦值
sheet['A1'].value = 2
# 公式賦值
sheet['A6'].value = '=SUM(A1:A5)'
另外,也可使用 sheet.append(parameters) 一行或多行寫入
# 寫入一行
row = [1 ,2, 3, 4, 5]
sheet.append(row)
# 寫入多行
rows = [
['ID', 'Name', 'Department'],
['001', 'Lee','CS'],
['002', 'John','MA'],
['003', 'Amy','IS']
]
sheet.append(rows)
(二)保存文件
寫完文件后,使用 workbook.save(path+filename)進(jìn)行保存,不過要注意文件擴(kuò)展名一定要是 xlsx 格式
# 保存文件至當(dāng)前目錄
wb.save('new_file.xlsx')
設(shè)置單元格樣式
單元格樣式主要包括字體、邊框、顏色以及對(duì)齊方式等,這些均位于 openpyxl.styles 庫中
# 導(dǎo)入字體、邊框、顏色以及對(duì)齊方式相關(guān)庫
from openpyxl.styles import Font, Border, Side, PatternFill, colors, Alignment
(一)字體
通過 sheet 單元格 font 屬性設(shè)置字體風(fēng)格
# 設(shè)置字體風(fēng)格為Times New Roman,大小為16,粗體、斜體,顏色藍(lán)色
sheet['A1'].font = Font(name='Times New Roman', size=16, bold=True, italic=True, color=colors.BLUE)
(二)對(duì)齊方式
通過 sheet 單元格 alignment 屬性設(shè)置文本對(duì)齊風(fēng)格
# 通過參數(shù)horizontal和vertical來設(shè)置文字在單元格里的對(duì)齊方式,此外設(shè)置值還可為left和right
sheet['B1'].alignment = Alignment(horizontal='center',vertical='center')
(三)邊框
通過 sheet 單元格 border 屬性設(shè)置字體風(fēng)格
# 首先設(shè)置邊框四個(gè)方向的線條種類
left, right, top, bottom = [Side(style='thin', color='000000')] * 4
# 再將各方向線條作為參數(shù)傳入Border方法
sheet['C1'].border = Border(left=left, right=right, top=top, bottom=bottom)
(四)設(shè)置行高和列寬
行和列的長度大小可以通過 row_dimensions[序號(hào)].height 和 column_dimensions[標(biāo)號(hào)].width 來設(shè)置
# 設(shè)置行高
sheet.row_dimensions[1].height = 25
# 設(shè)置列寬
sheet.column_dimensions['D'].width = 15.5
(五)合并和拆分單元格
對(duì)單元格的合并與拆分,主要是通過 sheet 的 merge_cells(args1:args2)和unmerge_cells(args1:args2) 兩個(gè)方法來實(shí)現(xiàn)的
當(dāng)然,除了對(duì)角矩形區(qū)域化合并,也可以對(duì)一行或一列進(jìn)行合并,只需相應(yīng)修改參數(shù)即可。不過,這里要注意的是,合并后單元格顯示的文本內(nèi)容是合并前最左上角單元格的內(nèi)容,而其他單元格內(nèi)容則會(huì)自動(dòng)清除。
# 合并單元格
sheet.merge_cells('A1:B2')
# 拆分單元格
sheet.unmerge_cells('A1:B2')