python辦公自動(dòng)化:excel

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))
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容