Python使用openpyxl生成、讀取、修改Excel
很多日常辦公場(chǎng)景都會(huì)遇到 Excel:整理銷售數(shù)據(jù)、統(tǒng)計(jì)考勤、合并表格、批量改格式、給領(lǐng)導(dǎo)生成周報(bào)。如果每次都靠手動(dòng)復(fù)制、篩選、改顏色,效率會(huì)很低,也容易出錯(cuò)。
openpyxl 是 Python 里非常常用的 Excel 處理庫(kù),適合操作 .xlsx 文件。本文用一份完整演示代碼,帶大家學(xué)會(huì)三個(gè)高頻動(dòng)作:
- 生成 Excel 文件
- 讀取 Excel 內(nèi)容
- 修改已有 Excel 文件
適合剛開始學(xué)習(xí) Python、也想提升 Excel 辦公效率的小伙伴。
一、安裝 openpyxl
先在命令行安裝:
pip install openpyxl
如果你使用的是多個(gè) Python 版本,也可以這樣安裝:
python -m pip install openpyxl
二、完整演示代碼
下面這段代碼會(huì)完成一個(gè)完整流程:
- 生成一份
student_score.xlsx - 寫入學(xué)生成績(jī)數(shù)據(jù)
- 設(shè)置標(biāo)題、表頭、列寬、顏色、凍結(jié)窗格
- 讀取 Excel 并打印每一行
- 修改 Excel:新增平均分、等級(jí)、備注,并保存為新文件
建議新建一個(gè) openpyxl_excel_demo.py 文件,把代碼復(fù)制進(jìn)去直接運(yùn)行。
from pathlib import Path
from openpyxl import Workbook, load_workbook
from openpyxl.styles import Font, PatternFill, Alignment, Border, Side
from openpyxl.utils import get_column_letter
BASE_DIR = Path(__file__).resolve().parent
SOURCE_FILE = BASE_DIR / "student_score.xlsx"
UPDATED_FILE = BASE_DIR / "student_score_updated.xlsx"
def create_excel(file_path: Path) -> None:
"""生成一份學(xué)生成績(jī) Excel。"""
wb = Workbook()
ws = wb.active
ws.title = "成績(jī)表"
# 標(biāo)題
ws.merge_cells("A1:F1")
ws["A1"] = "學(xué)生成績(jī)統(tǒng)計(jì)表"
ws["A1"].font = Font(name="微軟雅黑", size=16, bold=True, color="FFFFFF")
ws["A1"].fill = PatternFill("solid", fgColor="4472C4")
ws["A1"].alignment = Alignment(horizontal="center", vertical="center")
ws.row_dimensions[1].height = 28
# 表頭和數(shù)據(jù)
headers = ["學(xué)號(hào)", "姓名", "語(yǔ)文", "數(shù)學(xué)", "英語(yǔ)", "班級(jí)"]
rows = [
[1001, "張三", 88, 92, 85, "一班"],
[1002, "李四", 76, 81, 79, "一班"],
[1003, "王五", 95, 89, 93, "二班"],
[1004, "趙六", 68, 72, 70, "二班"],
[1005, "孫七", 84, 86, 91, "三班"],
]
ws.append([])
ws.append(headers)
for row in rows:
ws.append(row)
# 樣式
header_fill = PatternFill("solid", fgColor="D9EAF7")
thin = Side(style="thin", color="D9D9D9")
border = Border(left=thin, right=thin, top=thin, bottom=thin)
for row in ws.iter_rows(min_row=3, max_row=ws.max_row, min_col=1, max_col=6):
for cell in row:
cell.border = border
cell.alignment = Alignment(horizontal="center", vertical="center")
for cell in ws[3]:
cell.font = Font(bold=True)
cell.fill = header_fill
# 設(shè)置列寬
column_widths = [12, 12, 10, 10, 10, 12]
for index, width in enumerate(column_widths, start=1):
ws.column_dimensions[get_column_letter(index)].width = width
# 凍結(jié)表頭,開啟篩選
ws.freeze_panes = "A4"
ws.auto_filter.ref = f"A3:F{ws.max_row}"
wb.save(file_path)
print(f"已生成 Excel:{file_path}")
def read_excel(file_path: Path) -> None:
"""讀取 Excel 內(nèi)容并打印。"""
wb = load_workbook(file_path)
ws = wb["成績(jī)表"]
print("\n讀取 Excel 內(nèi)容:")
for row in ws.iter_rows(min_row=4, values_only=True):
student_id, name, chinese, math, english, class_name = row
print(
f"學(xué)號(hào):{student_id},姓名:{name},"
f"語(yǔ)文:{chinese},數(shù)學(xué):{math},英語(yǔ):{english},班級(jí):{class_name}"
)
def update_excel(source_path: Path, target_path: Path) -> None:
"""修改 Excel,增加平均分、等級(jí)、備注。"""
wb = load_workbook(source_path)
ws = wb["成績(jī)表"]
# 新增表頭
ws["G3"] = "平均分"
ws["H3"] = "等級(jí)"
ws["I3"] = "備注"
for cell in ws[3]:
cell.font = Font(bold=True)
cell.fill = PatternFill("solid", fgColor="D9EAF7")
cell.alignment = Alignment(horizontal="center", vertical="center")
for row_index in range(4, ws.max_row + 1):
chinese = ws.cell(row=row_index, column=3).value
math = ws.cell(row=row_index, column=4).value
english = ws.cell(row=row_index, column=5).value
average = round((chinese + math + english) / 3, 2)
ws.cell(row=row_index, column=7).value = average
if average >= 90:
level = "優(yōu)秀"
remark = "繼續(xù)保持"
elif average >= 80:
level = "良好"
remark = "表現(xiàn)穩(wěn)定"
elif average >= 70:
level = "合格"
remark = "仍有提升空間"
else:
level = "待提升"
remark = "建議重點(diǎn)輔導(dǎo)"
ws.cell(row=row_index, column=8).value = level
ws.cell(row=row_index, column=9).value = remark
# 給新增區(qū)域補(bǔ)樣式
thin = Side(style="thin", color="D9D9D9")
border = Border(left=thin, right=thin, top=thin, bottom=thin)
for row in ws.iter_rows(min_row=3, max_row=ws.max_row, min_col=1, max_col=9):
for cell in row:
cell.border = border
cell.alignment = Alignment(horizontal="center", vertical="center")
for column in range(7, 10):
ws.column_dimensions[get_column_letter(column)].width = 14
ws.auto_filter.ref = f"A3:I{ws.max_row}"
wb.save(target_path)
print(f"\n已修改并另存為:{target_path}")
def main() -> None:
create_excel(SOURCE_FILE)
read_excel(SOURCE_FILE)
update_excel(SOURCE_FILE, UPDATED_FILE)
if __name__ == "__main__":
main()
三、代碼運(yùn)行后會(huì)得到什么
運(yùn)行命令:
python openpyxl_excel_demo.py
執(zhí)行完成后,當(dāng)前目錄會(huì)生成兩個(gè)文件:
student_score.xlsx:原始學(xué)生成績(jī)表student_score_updated.xlsx:新增平均分、等級(jí)、備注之后的成績(jī)表
控制臺(tái)也會(huì)打印讀取到的數(shù)據(jù),例如:
已生成 Excel:student_score.xlsx 讀取 Excel 內(nèi)容: 學(xué)號(hào):1001,姓名:張三,語(yǔ)文:88,數(shù)學(xué):92,英語(yǔ):85,班級(jí):一班 學(xué)號(hào):1002,姓名:李四,語(yǔ)文:76,數(shù)學(xué):81,英語(yǔ):79,班級(jí):一班 已修改并另存為:student_score_updated.xlsx
四、核心知識(shí)點(diǎn)拆解
1. 創(chuàng)建工作簿
wb = Workbook() ws = wb.active ws.title = "成績(jī)表"
Workbook() 表示新建一個(gè) Excel 文件,wb.active 獲取默認(rèn)工作表,ws.title 可以修改工作表名稱。
2. 寫入單元格
ws["A1"] = "學(xué)生成績(jī)統(tǒng)計(jì)表" ws.append(["學(xué)號(hào)", "姓名", "語(yǔ)文", "數(shù)學(xué)", "英語(yǔ)", "班級(jí)"])
常見(jiàn)寫法有兩種:
ws["A1"] = 值:適合寫入指定單元格ws.append([...]):適合按行批量追加數(shù)據(jù)
3. 讀取工作簿
wb = load_workbook("student_score.xlsx")
ws = wb["成績(jī)表"]
讀取已有 Excel 文件時(shí)使用 load_workbook()。如果文件里有多個(gè) sheet,可以通過(guò)名稱獲取對(duì)應(yīng)工作表。
4. 遍歷行數(shù)據(jù)
for row in ws.iter_rows(min_row=4, values_only=True):
print(row)
iter_rows() 很適合批量讀取表格數(shù)據(jù)。
min_row=4表示從第 4 行開始讀values_only=True表示只讀取單元格的值,不讀取單元格對(duì)象
5. 修改并保存為新文件
wb = load_workbook("student_score.xlsx")
ws = wb["成績(jī)表"]
ws["G3"] = "平均分"
wb.save("student_score_updated.xlsx")
實(shí)際工作中,建議不要直接覆蓋原始文件??梢韵茸x取源文件,再另存為新文件,這樣出錯(cuò)時(shí)還能保留原始數(shù)據(jù)。
五、openpyxl 適合哪些辦公自動(dòng)化場(chǎng)景
openpyxl 可以幫你處理很多重復(fù)性的 Excel 工作,例如:
- 批量生成日?qǐng)?bào)、周報(bào)、月報(bào)
- 批量讀取多個(gè) Excel 文件的數(shù)據(jù)
- 給 Excel 自動(dòng)加表頭、顏色、邊框、列寬
- 根據(jù)分?jǐn)?shù)、金額、狀態(tài)自動(dòng)計(jì)算等級(jí)
- 自動(dòng)篩選異常數(shù)據(jù)
- 批量修改表格格式
- 自動(dòng)生成帶公式的統(tǒng)計(jì)表
如果你每天都在重復(fù)打開 Excel、復(fù)制粘貼、改格式,那么這類腳本很值得學(xué)習(xí)。
六、學(xué)習(xí)建議
剛學(xué) openpyxl 時(shí),不建議一開始就追求復(fù)雜功能??梢园聪旅骓樞蚓毩?xí):
- 先會(huì)新建 Excel、寫入幾行數(shù)據(jù)
- 再學(xué)讀取已有 Excel
- 再學(xué)修改單元格內(nèi)容
- 然后學(xué)習(xí)樣式、列寬、凍結(jié)窗格、篩選
- 最后結(jié)合真實(shí)工作表,把重復(fù)操作寫成腳本
Python 辦公自動(dòng)化的價(jià)值,不在于寫出多復(fù)雜的代碼,而在于把每天重復(fù) 30 分鐘的事情,變成一個(gè) 3 秒鐘執(zhí)行完成的腳本。
七、總結(jié)
本文用一份完整代碼演示了如何用 openpyxl 完成 Excel 的生成、讀取和修改。你可以把這個(gè)腳本當(dāng)成模板,換成自己的業(yè)務(wù)字段,例如員工信息、訂單數(shù)據(jù)、考勤記錄、銷售統(tǒng)計(jì)等。
掌握這些基礎(chǔ)之后,再繼續(xù)學(xué)習(xí)公式、圖表、多文件合并、批量報(bào)表生成,Python 處理 Excel 的效率會(huì)非常明顯。
以上就是Python使用openpyxl生成、讀取、修改Excel的詳細(xì)內(nèi)容,更多關(guān)于Python openpyxl操作Excel的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python時(shí)間管理黑科技之datetime函數(shù)詳解
在Python中,datetime模塊是處理日期和時(shí)間的標(biāo)準(zhǔn)庫(kù),它提供了一系列功能強(qiáng)大的函數(shù)和類,用于處理日期、時(shí)間、時(shí)間間隔等,本文將深入探討datetime模塊的使用方法,感興趣的可以了解下2023-08-08
Python如何基于Tesseract實(shí)現(xiàn)識(shí)別文字功能
這篇文章主要介紹了Python如何基于Tesseract實(shí)現(xiàn)識(shí)別文字功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06
Python中用于去除空格的三個(gè)函數(shù)的使用小結(jié)
這篇文章主要介紹了Python中用于去除空格的三個(gè)函數(shù)的使用小結(jié),對(duì)strip()和lstrip()和rstrip()這三個(gè)函數(shù)做了簡(jiǎn)單的講解,需要的朋友可以參考下2015-04-04
Python3字符串的常用操作方法之修改方法與大小寫字母轉(zhuǎn)化
這篇文章主要介紹了Python3字符串的常用操作方法之修改方法與大小寫字母轉(zhuǎn)化,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09
pygame實(shí)現(xiàn)雷電游戲雛形開發(fā)
這篇文章主要為大家詳細(xì)介紹了pygame實(shí)現(xiàn)雷電游戲開發(fā)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-11-11

