python 使用 openpyxl 操作 excel
- openpyxl 最好用的 python 操作 excel 表格庫(kù),不接受反駁(想反駁自己去學(xué)其他的)
- openpyxl 官網(wǎng)鏈接:https://openpyxl.readthedocs.io/en/stable/
- openpyxl 只支持【.xlsx / .xlsm / .xltx / .xltm】格式的文件
- 建議在jupyter-notebook里面操作
打開(kāi) Excel 表格并獲取表格名稱;通過(guò) sheet 名稱獲取表格
from openpyxl import load_workbook
workbook = load_workbook(filename = "test.xlsx")
workbook.sheetnames #打開(kāi) Excel 表格并獲取表格名稱
sheet = workbook["Sheet1"] #通過(guò) sheet 名稱獲取表格
sheet.dimensions # 獲取表格的尺寸大小(幾行幾列數(shù)據(jù))
獲取表格內(nèi)某個(gè)格子的數(shù)據(jù)
workbook = load_workbook(filename = "test.xlsx")
sheet = workbook.active #打開(kāi)激活的表格
print(sheet)
cell1 = sheet["A1"] #獲取 A1 格子的數(shù)據(jù)
cell2 = sheet["C11"]
cell3 = sheet.cell(row = 1,column = 1) #通過(guò)指定行列號(hào)獲取格子數(shù)據(jù)
cell4 = sheet.cell(row = 11,column = 3)
print(cell1.value, cell1.row, cell1.column, cell1.coordinate)
#獲取格子中的值、行數(shù)、列數(shù)、坐標(biāo);
sheet["A"] --- 獲取 A 列的數(shù)據(jù)
sheet["A:C"] --- 獲取 A,B,C 三列的數(shù)據(jù)
sheet[5] --- 只獲取第 5 行的數(shù)據(jù)
# 獲取 A1:C2 區(qū)域的值
cell = sheet["A1:C2"]
print(cell)
for i in cell:
for j in i:
print(j.value)
- .iter_rows()方式(類似pandas里面的iterrows)有.iter_rows()方式,肯定也會(huì)有.iter_cols()方式,只不過(guò)一個(gè)是按行讀取,一個(gè)是按
列讀取。
workbook = load_workbook(filename = "test.xlsx")
sheet = workbook.active
print(sheet)
# 按行獲取值
for i in sheet.iter_rows(min_row=2, max_row=5, min_col=1, max_col=2): #按行讀取
for j in i:
print(j.value)
# 按列獲取值
for i in sheet.iter_cols(min_row=2, max_row=5, min_col=1, max_col=2): #按列讀取
for j in i:
print(j.value)
for i in sheet.rows: #獲取所有行
print(i)
修改表格中的內(nèi)容: 向某個(gè)格子中寫(xiě)入內(nèi)容并保存
workbook = load_workbook(filename = "test.xlsx")
sheet = workbook.active
print(sheet)
sheet["A1"] = "哈嘍"
# 這句代碼也可以改為 cell = sheet["A1"] cell.value = "哈嘍"
workbook.save(filename = "哈嘍.xlsx")
"""
注意:我們將“A1”單元格的數(shù)據(jù)改為了“哈嘍”,并另存為了“哈嘍.xlsx”文
件。 如果我們保存的時(shí)候,不修改表名,相當(dāng)于直接修改源文件;
"""
- .append()方式:會(huì)在表格已有的數(shù)據(jù)后面,按行插入數(shù)據(jù)(很有用);
workbook = load_workbook(filename = "test.xlsx")
sheet = workbook.active
print(sheet)
data = [
["唐僧","男","180cm"],
["孫悟空","男","188cm"],
["豬八戒","男","175cm"],
["沙僧","男","176cm"],
]
for row in data:
sheet.append(row)
workbook.save(filename = "test.xlsx")
使用 excel 函數(shù)公式(很有用)
import openpyxl
from openpyxl.utils import FORMULAE
print(FORMULAE)#python 支持寫(xiě)哪些“excel 函數(shù)公式”
# 這是我們?cè)?excel 中輸入的公式
=IF(RIGHT(C2,2)="cm",C2,SUBSTITUTE(C2,"m","")*100&"cm")
# 那么,在 python 中怎么插入 excel 公式呢?
workbook = load_workbook(filename = "test.xlsx")
sheet = workbook.active
print(sheet)
sheet["D1"] = "標(biāo)準(zhǔn)身高"
for i in range(2,16):
sheet["D{}".format(i)] =
'=IF(RIGHT(C{},2)="cm",C{},SUBSTITUTE(C{},"m","")*100&"cm")'.format(i,i,i)
workbook.save(filename = "test.xlsx")
.insert_cols()和.insert_rows():插入空行和空列
- .insert_cols(idx=數(shù)字編號(hào), amount=要插入的列數(shù)),插入的位置是在 idx 列數(shù)的左側(cè)插入;
- .insert_rows(idx=數(shù)字編號(hào), amount=要插入的行數(shù)),插入的行數(shù)是在 idx 行數(shù)的下方插入;
workbook = load_workbook(filename = "test.xlsx")
sheet = workbook.active
print(sheet)
sheet.insert_cols(idx=4,amount=2) #從第4列開(kāi)始插入2列
sheet.insert_rows(idx=5,amount=4) #第5行開(kāi)始插入2行
workbook.save(filename = "test.xlsx")
.delete_rows()和.delete_cols():刪除行和列
- .delete_rows(idx=數(shù)字編號(hào), amount=要?jiǎng)h除的行數(shù))
- .delete_cols(idx=數(shù)字編號(hào), amount=要?jiǎng)h除的列數(shù))
workbook = load_workbook(filename = "test.xlsx")
sheet = workbook.active print(sheet)
# 刪除第一列,第一行
sheet.delete_cols(idx=1)
sheet.delete_rows(idx=1)
workbook.save(filename = "test.xlsx")
.move_range():移動(dòng)格子
- .move_range("數(shù)據(jù)區(qū)域",rows=,cols=):row正整數(shù)表示向下、負(fù)整數(shù)表示向上移動(dòng);cols正整數(shù)表示向右、負(fù)整數(shù)表示向左移動(dòng)。
sheet.move_range("C1:D4",rows=2,cols=-1)# 向左移動(dòng)兩列,向下移動(dòng)兩行
.create_sheet():創(chuàng)建新的 sheet 表格
- .create_sheet("新的 sheet 名"):創(chuàng)建一個(gè)新的 sheet 表;
workbook = load_workbook(filename = "test.xlsx")
sheet = workbook.active
print(sheet)
workbook.create_sheet("我是一個(gè)新的 sheet")
print(workbook.sheetnames)
workbook.save(filename = "test.xlsx")
.remove():刪除某個(gè) sheet 表
- .remove("sheet 名"):刪除某個(gè) sheet 表;
workbook = load_workbook(filename = "test.xlsx")
sheet = workbook.active print(workbook.sheetnames)
# 這個(gè)相當(dāng)于激活的這個(gè) sheet 表,激活狀態(tài)下,才可以操作;
sheet = workbook['我是一個(gè)新的 sheet']
print(sheet)
workbook.remove(sheet)
print(workbook.sheetnames)
workbook.save(filename = "test.xlsx")
.copy_worksheet():復(fù)制一個(gè) sheet 表到另外一張 excel 表
- 這個(gè)操作的實(shí)質(zhì),就是復(fù)制某個(gè) excel 表中的 sheet 表,然后將文件存儲(chǔ)到另外一張excel 表中
workbook = load_workbook(filename = "a.xlsx")
sheet = workbook.active
print("a.xlsx 中有這幾個(gè) sheet 表",workbook.sheetnames)
sheet = workbook['姓名']
workbook.copy_worksheet(sheet)
workbook.save(filename = "test.xlsx")
sheet.title:修改 sheet 表的名稱
workbook = load_workbook(filename = "a.xlsx")
sheet = workbook.active
print(sheet)
sheet.title = "我是修改后的 sheet 名"
print(sheet)
創(chuàng)建新的 excel 表格文件
from openpyxl import Workbook
workbook = Workbook()
sheet = workbook.active
sheet.title = "表格 1"
workbook.save(filename = "新建的 excel 表格")
sheet.freeze_panes:凍結(jié)窗口
- .freeze_panes = "單元格"
workbook = load_workbook(filename = "花園.xlsx")
sheet = workbook.active print(sheet) sheet.freeze_panes = "C3"
workbook.save(filename = "花園.xlsx")
"""
凍結(jié)窗口以后,你可以打開(kāi)源文件,進(jìn)行檢驗(yàn);
"""
sheet.auto_filter.ref:給表格添加“篩選器”
- .auto_filter.ref = sheet.dimension 給所有字段添加篩選器;
- .auto_filter.ref = "A1" 給 A1 這個(gè)格子添加“篩選器”,就是給第一列添加“篩選器”;
workbook = load_workbook(filename = "花園.xlsx")
sheet = workbook.active
print(sheet)
sheet.auto_filter.ref = sheet["A1"]
workbook.save(filename = "花園.xlsx")
批量調(diào)整字體和樣式
1)修改字體樣式
- Font(name=字體名稱,size=字體大小,bold=是否加粗,italic=是否斜體,color=字體顏色)
from openpyxl.styles import Font
from openpyxl import load_workbook
workbook = load_workbook(filename="花園.xlsx")
sheet = workbook.active
cell = sheet["A1"]
font = Font(name="微軟雅黑",size=20,bold=True,italic=True,color="FF0000")
cell.font = font
workbook.save(filename = "花園.xlsx")
"""
這個(gè) color 是 RGB 的 16 進(jìn)制表示,自己下去百度學(xué)習(xí);
"""
2)獲取表格中格子的字體樣式
from openpyxl.styles import Font
from openpyxl import load_workbook
workbook = load_workbook(filename="花園.xlsx")
sheet = workbook.active
cell = sheet["A2"]
font = cell.font
print(font.name, font.size, font.bold, font.italic, font.color)
3)設(shè)置對(duì)齊樣式
- Alignment(horizontal=水平對(duì)齊模式,vertical=垂直對(duì)齊模式,text_rotation=旋轉(zhuǎn)角
度,wrap_text=是否自動(dòng)換行) - 水平對(duì)齊:‘distributed',‘justify',‘center',‘leftfill', ‘centerContinuous',‘right,
‘general'; - 垂直對(duì)齊:‘bottom',‘distributed',‘justify',‘center',‘top';
from openpyxl.styles import Alignment
from openpyxl import load_workbook
workbook = load_workbook(filename="花園.xlsx")
sheet = workbook.active
cell = sheet["A1"]
alignment =
Alignment(horizontal="center",vertical="center",text_rotation=45,wrap_text=True)
cell.alignment = alignment
workbook.save(filename = "花園.xlsx")
4)設(shè)置邊框樣式
- Side(style=邊線樣式,color=邊線顏色)
- Border(left=左邊線樣式,right=右邊線樣式,top=上邊線樣式,bottom=下邊線樣式)
- style 參數(shù)的種類: 'double, 'mediumDashDotDot', 'slantDashDot', 'dashDotDot','dotted','hair',
'mediumDashed, 'dashed', 'dashDot', 'thin', 'mediumDashDot','medium', 'thick'
from openpyxl.styles import Side,Border
from openpyxl import load_workbook
workbook = load_workbook(filename="花園.xlsx")
sheet = workbook.active
cell = sheet["D6"]
side1 = Side(style="thin",color="FF0000")
side2 = Side(style="thick",color="FFFF0000")
border = Border(left=side1,right=side1,top=side2,bottom=side2)
cell.border = border
workbook.save(filename = "花園.xlsx")
5)設(shè)置填充樣式
- PatternFill(fill_type=填充樣式,fgColor=填充顏色)
- GradientFill(stop=(漸變顏色 1,漸變顏色 2……))
from openpyxl.styles import PatternFill,GradientFill
from openpyxl import load_workbook
workbook = load_workbook(filename="花園.xlsx")
sheet = workbook.active
cell_b9 = sheet["B9"]
pattern_fill = PatternFill(fill_type="solid",fgColor="99ccff")
cell_b9.fill = pattern_fill
cell_b10 = sheet["B10"]
gradient_fill = GradientFill(stop=("FFFFFF","99ccff","000000"))
cell_b10.fill = gradient_fill
workbook.save(filename = "花園.xlsx")
6)設(shè)置行高和列寬
- .row_dimensions[行編號(hào)].height = 行高
- .column_dimensions[列編號(hào)].width = 列寬
workbook = load_workbook(filename="花園.xlsx")
sheet = workbook.active
# 設(shè)置第 1 行的高度
sheet.row_dimensions[1].height = 50 #將整個(gè)表的行高設(shè)置為 50
# 設(shè)置 B 列的寬度
sheet.column_dimensions["B"].width = 20 #列寬設(shè)置為 30;
workbook.save(filename = "花園.xlsx")
7)合并單元格
- .merge_cells(待合并的格子編號(hào))
- .merge_cells(start_row=起始行號(hào),start_column=起始列號(hào),end_row=結(jié)束行號(hào),
end_column=結(jié)束列號(hào))
workbook = load_workbook(filename="花園.xlsx")
sheet = workbook.active sheet.merge_cells("C1:D2")
sheet.merge_cells(start_row=7,start_column=1,end_row=8,end_column=3)
workbook.save(filename = "花園.xlsx")
當(dāng)然,也有“取消合并單元格”,用法一致。
- .unmerge_cells(待合并的格子編號(hào))
- .unmerge_cells(start_row=起始行號(hào),start_column=起始列號(hào),end_row=結(jié)束行號(hào),
end_column=結(jié)束列號(hào))