Python使用openpyxl處理Excel文件的操作指南
什么是 openpyxl?
openpyxl 是 Python 中用于讀寫 Excel 文件(.xlsx 格式)的第三方庫。它能讓您用 Python 程序自動處理 Excel 文件,比如:
- 批量讀取數(shù)據(jù)
- 自動生成報表
- 修改表格格式
- 合并多個 Excel 文件
主要功能
- ? 讀取和寫入
.xlsx文件 - ? 操作工作表和單元格
- ? 設(shè)置樣式和格式(字體、顏色、邊框等)
- ? 插入圖表和公式
- ? 處理大文件(支持只讀模式)
應(yīng)用場景
- 數(shù)據(jù)處理:批量讀取 Excel 數(shù)據(jù)進行分析
- 報表生成:自動生成格式化的 Excel 報表
- 數(shù)據(jù)遷移:在不同系統(tǒng)間轉(zhuǎn)換數(shù)據(jù)格式
- 自動化辦公:替代重復(fù)的手工 Excel 操作
基本概念
在開始示例之前,先了解幾個重要概念:
1. 工作簿和工作表
- 工作簿(Workbook):整個 Excel 文件,相當(dāng)于一個容器
- 工作表(Worksheet):工作簿中的單個表格,可以有多個
2. 單元格定位
- A1 表示法:用列字母+行數(shù)字定位,如
A1、B2 - 坐標(biāo)表示法:用行列數(shù)字定位,如
(1, 1)表示第1行第1列
3. 常用方法參數(shù)
| 方法/參數(shù) | 說明 | 示例 |
|---|---|---|
load_workbook() | 打開已存在的文件 | wb = load_workbook('file.xlsx') |
Workbook() | 創(chuàng)建新工作簿 | wb = Workbook() |
active | 獲取當(dāng)前活動工作表 | ws = wb.active |
cell(row, column) | 通過坐標(biāo)訪問單元格 | ws.cell(1, 1) |
['A1'] | 通過 A1 表示法訪問 | ws['A1'] |
.value | 獲取/設(shè)置單元格值 | cell.value = 'Hello' |
save() | 保存文件 | wb.save('output.xlsx') |
4. 樣式相關(guān)
- Font:字體(大小、顏色、粗體等)
- PatternFill:填充顏色
- Border:邊框
- Alignment:對齊方式
入門示例
示例 1:創(chuàng)建第一個 Excel 文件
目標(biāo):創(chuàng)建一個新的 Excel 文件,并寫入一些數(shù)據(jù)。
提示:這是最基礎(chǔ)的例子。首先需要安裝 openpyxl(pip install openpyxl),然后創(chuàng)建 Workbook 對象,獲取工作表,寫入數(shù)據(jù),最后保存。
from openpyxl import Workbook
# 第 1 步:創(chuàng)建新工作簿
wb = Workbook()
# 第 2 步:獲取活動工作表(默認(rèn)創(chuàng)建的第一個工作表)
ws = wb.active
# 第 3 步:設(shè)置工作表名稱
ws.title = "我的數(shù)據(jù)"
# 第 4 步:寫入數(shù)據(jù)(使用 A1 表示法)
ws['A1'] = '姓名'
ws['B1'] = '年齡'
ws['A2'] = '張三'
ws['B2'] = 25
# 第 5 步:保存文件
wb.save('示例.xlsx')
print("文件已創(chuàng)建!")
運行效果:
- 會在當(dāng)前目錄生成
示例.xlsx文件 - A1 單元格為"姓名",B1 為"年齡"
- A2 單元格為"張三",B2 為 25
關(guān)鍵要點:
- 使用
Workbook()創(chuàng)建新文件 active獲取默認(rèn)工作表- 通過
['A1']訪問單元格 - 必須調(diào)用
save()才能保存文件
示例 2:讀取現(xiàn)有文件
目標(biāo):打開一個已存在的 Excel 文件,讀取其中的數(shù)據(jù)。
提示:使用 load_workbook() 打開文件。注意文件路徑要正確,如果文件不存在會報錯。
from openpyxl import load_workbook
# 打開已存在的文件
wb = load_workbook('示例.xlsx')
# 獲取工作表(通過名稱)
ws = wb['我的數(shù)據(jù)']
# 讀取單元格值
name = ws['A1'].value
age = ws['B1'].value
print(f"A1 的值:{name}")
print(f"B1 的值:{age}")
# 讀取 A2 和 B2
print(f"姓名:{ws['A2'].value}, 年齡:{ws['B2'].value}")
運行效果:
A1 的值:姓名 B1 的值:年齡 姓名:張三, 年齡:25
關(guān)鍵要點:
load_workbook()用于打開已存在的文件- 通過工作表名稱
wb['工作表名']獲取工作表 .value獲取單元格的值
示例 3:使用坐標(biāo)方式訪問單元格
目標(biāo):學(xué)習(xí)用行列數(shù)字(坐標(biāo))的方式訪問單元格,這在循環(huán)中更方便。
提示:cell(row, column) 方法用數(shù)字定位,row 和 column 都從 1 開始。這種方式在批量操作時比 A1 表示法更方便。
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
# 寫入表頭
ws.cell(1, 1, '產(chǎn)品') # 第1行第1列
ws.cell(1, 2, '價格') # 第1行第2列
ws.cell(1, 3, '數(shù)量') # 第1行第3列
# 寫入數(shù)據(jù)
ws.cell(2, 1, '蘋果')
ws.cell(2, 2, 5.5)
ws.cell(2, 3, 10)
ws.cell(3, 1, '香蕉')
ws.cell(3, 2, 3.2)
ws.cell(3, 3, 20)
wb.save('商品清單.xlsx')
print("文件已創(chuàng)建!")
運行效果:
- 創(chuàng)建包含 3 列數(shù)據(jù)的表格
- 第1行是表頭,第2-3行是數(shù)據(jù)
關(guān)鍵要點:
cell(row, column, value)三個參數(shù):行、列、值- 也可以先獲取單元格再賦值:
ws.cell(1, 1).value = '產(chǎn)品' - 坐標(biāo)從 1 開始,不是 0
示例 4:批量寫入數(shù)據(jù)
目標(biāo):使用循環(huán)批量寫入多行數(shù)據(jù),這是實際應(yīng)用中最常見的場景。
提示:結(jié)合 Python 的循環(huán)和列表,可以高效地批量寫入數(shù)據(jù)。注意行號從 1 開始,通常第 1 行是表頭。
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
# 表頭
headers = ['姓名', '部門', '工資']
for col, header in enumerate(headers, start=1):
ws.cell(1, col, header)
# 數(shù)據(jù)列表
employees = [
['張三', '技術(shù)部', 8000],
['李四', '銷售部', 6000],
['王五', '人事部', 5500],
['趙六', '技術(shù)部', 9000],
]
# 批量寫入數(shù)據(jù)
for row, employee in enumerate(employees, start=2): # 從第2行開始
for col, value in enumerate(employee, start=1):
ws.cell(row, col, value)
wb.save('員工信息.xlsx')
print(f"已寫入 {len(employees)} 條員工數(shù)據(jù)")
運行效果:
- 創(chuàng)建包含 4 名員工信息的表格
- 第1行是表頭,第2-5行是員工數(shù)據(jù)
關(guān)鍵要點:
enumerate(start=1)從指定數(shù)字開始計數(shù)- 外層循環(huán)控制行,內(nèi)層循環(huán)控制列
- 表頭通常在第1行,數(shù)據(jù)從第2行開始
示例 5:讀取整個表格
目標(biāo):讀取 Excel 文件中的所有數(shù)據(jù),并打印出來。
提示:使用 max_row 和 max_column 獲取工作表的行列范圍,然后循環(huán)讀取所有單元格。這是讀取整個表格的標(biāo)準(zhǔn)方法。
from openpyxl import load_workbook
wb = load_workbook('員工信息.xlsx')
ws = wb.active
# 獲取表格的最大行數(shù)和列數(shù)
max_row = ws.max_row
max_column = ws.max_column
print(f"表格大?。簕max_row} 行 × {max_column} 列\(zhòng)n")
# 讀取所有數(shù)據(jù)
for row in range(1, max_row + 1):
row_data = []
for col in range(1, max_column + 1):
cell_value = ws.cell(row, col).value
row_data.append(cell_value)
print(row_data)
運行效果:
表格大?。? 行 × 3 列 ['姓名', '部門', '工資'] ['張三', '技術(shù)部', 8000] ['李四', '銷售部', 6000] ['王五', '人事部', 5500] ['趙六', '技術(shù)部', 9000]
關(guān)鍵要點:
max_row和max_column獲取實際使用的行列數(shù)range(1, max_row + 1)包含最后一行- 空單元格的值為
None
示例 6:設(shè)置單元格樣式
目標(biāo):給表格添加樣式,讓表頭更醒目(加粗、背景色)。
提示:openpyxl 的樣式功能很強大。需要導(dǎo)入 Font(字體)和 PatternFill(填充)。樣式需要賦值給單元格的 font 和 fill 屬性。
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Alignment
wb = Workbook()
ws = wb.active
# 寫入表頭
headers = ['姓名', '分?jǐn)?shù)', '等級']
for col, header in enumerate(headers, start=1):
cell = ws.cell(1, col, header)
# 設(shè)置字體:加粗、白色、14號
cell.font = Font(bold=True, color='FFFFFF', size=14)
# 設(shè)置背景色:藍色
cell.fill = PatternFill(start_color='4472C4', end_color='4472C4', fill_type='solid')
# 設(shè)置對齊:居中
cell.alignment = Alignment(horizontal='center', vertical='center')
# 寫入數(shù)據(jù)
data = [
['張三', 95, '優(yōu)秀'],
['李四', 78, '良好'],
['王五', 65, '及格'],
]
for row, row_data in enumerate(data, start=2):
for col, value in enumerate(row_data, start=1):
ws.cell(row, col, value)
# 調(diào)整列寬(讓內(nèi)容顯示完整)
ws.column_dimensions['A'].width = 12
ws.column_dimensions['B'].width = 10
ws.column_dimensions['C'].width = 10
wb.save('成績單.xlsx')
print("帶樣式的文件已創(chuàng)建!")
運行效果:
- 表頭為藍色背景、白色加粗字體、居中
- 數(shù)據(jù)行保持默認(rèn)樣式
- 列寬自動調(diào)整
關(guān)鍵要點:
Font()設(shè)置字體樣式(bold、color、size)PatternFill()設(shè)置背景色(顏色用十六進制代碼)Alignment()設(shè)置對齊方式column_dimensions調(diào)整列寬
示例 7:實戰(zhàn)應(yīng)用 - 數(shù)據(jù)統(tǒng)計
目標(biāo):讀取員工數(shù)據(jù),按部門統(tǒng)計平均工資,并生成新的報表。
提示:這是一個綜合示例,結(jié)合了讀取、處理、寫入和樣式設(shè)置。實際項目中的 openpyxl 使用就是這樣的結(jié)構(gòu)。
from openpyxl import load_workbook, Workbook
from openpyxl.styles import Font, PatternFill
# 讀取原始數(shù)據(jù)
wb = load_workbook('員工信息.xlsx')
ws = wb.active
# 統(tǒng)計各部門工資
departments = {}
for row in range(2, ws.max_row + 1): # 跳過表頭
dept = ws.cell(row, 2).value # 部門在第2列
salary = ws.cell(row, 3).value # 工資在第3列
if dept not in departments:
departments[dept] = []
departments[dept].append(salary)
# 創(chuàng)建統(tǒng)計報表
wb_new = Workbook()
ws_new = wb_new.active
ws_new.title = "部門統(tǒng)計"
# 寫入表頭
ws_new['A1'] = '部門'
ws_new['B1'] = '人數(shù)'
ws_new['C1'] = '平均工資'
# 設(shè)置表頭樣式
header_fill = PatternFill(start_color='4472C4', end_color='4472C4', fill_type='solid')
header_font = Font(bold=True, color='FFFFFF')
for col in ['A1', 'B1', 'C1']:
cell = ws_new[col]
cell.fill = header_fill
cell.font = header_font
# 寫入統(tǒng)計數(shù)據(jù)
row = 2
for dept, salaries in departments.items():
ws_new.cell(row, 1, dept)
ws_new.cell(row, 2, len(salaries))
avg_salary = sum(salaries) / len(salaries)
ws_new.cell(row, 3, round(avg_salary, 2))
row += 1
wb_new.save('部門統(tǒng)計.xlsx')
print("統(tǒng)計報表已生成!")
運行效果:
- 讀取員工信息.xlsx
- 按部門統(tǒng)計人數(shù)和平均工資
- 生成新的統(tǒng)計報表文件
關(guān)鍵要點:
- 實際應(yīng)用會結(jié)合數(shù)據(jù)處理邏輯
- 可以讀取一個文件,生成另一個文件
- 樣式讓報表更專業(yè)
其他選擇
xlrd / xlwt - 老式庫
用于處理 .xls 格式(舊版 Excel):
import xlrd
wb = xlrd.open_workbook('file.xls')
適用場景:需要處理舊版 Excel 文件(.xls)
pandas - 數(shù)據(jù)分析
pandas 也可以讀寫 Excel,更適合數(shù)據(jù)分析:
import pandas as pd
df = pd.read_excel('file.xlsx')
df.to_excel('output.xlsx')
適用場景:數(shù)據(jù)分析、處理表格數(shù)據(jù)
xlsxwriter - 只寫模式
只能寫入,不能讀取,但性能更好:
import xlsxwriter
wb = xlsxwriter.Workbook('file.xlsx')
適用場景:只需要生成 Excel 文件,不需要讀取
如何選擇?
| 場景 | 推薦 |
|---|---|
| 讀寫 .xlsx 文件 | openpyxl ? |
| 數(shù)據(jù)分析處理 | pandas |
| 只生成文件 | xlsxwriter |
| 處理舊版 .xls | xlrd / xlwt |
openpyxl 的優(yōu)勢:
- ? 功能完整,讀寫都支持
- ? 支持樣式、圖表等高級功能
總結(jié):openpyxl 是處理 Excel 文件的標(biāo)準(zhǔn)方案。掌握本文的 7 個示例,就能處理絕大多數(shù)日常需求。
以上就是Python使用openpyxl處理Excel文件的操作指南的詳細內(nèi)容,更多關(guān)于Python openpyxl處理Excel文件的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
在Python下進行UDP網(wǎng)絡(luò)編程的教程
這篇文章主要介紹了在Python下進行UDP網(wǎng)絡(luò)編程的教程,UDP編程是Python網(wǎng)絡(luò)編程部分的基礎(chǔ)知識,示例代碼基于Python2.x版本,需要的朋友可以參考下2015-04-04
Python 中 requests 與 aiohttp 在實際項目中的
本文主要介紹了Python爬蟲開發(fā)中常用的兩個庫requests和aiohttp的使用方法及其區(qū)別,通過實際項目案例展示了這兩個庫的應(yīng)用,并從并發(fā)需求、項目復(fù)雜度、維護成本和性能要求等方面提出了在實際項目中選擇這兩個庫的策略,感興趣的朋友一起看看吧2025-01-01
Python實現(xiàn)標(biāo)記數(shù)組的連通域
這篇文章主要為大家詳細介紹了如何通過Python實現(xiàn)標(biāo)記數(shù)組的連通域,文中的示例代碼講解詳細,對我們學(xué)習(xí)Python有一定的幫助,需要的可以參考一下2023-04-04
pyecharts中from pyecharts import options
本文主要介紹了pyecharts中from pyecharts import options as opts報錯問題以及解決辦法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
python 集合set中 add與update區(qū)別介紹
這篇文章主要介紹了python 集合set中 add與update區(qū)別介紹,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03

