Python使用openpyxl自動化處理Excel數(shù)據(jù)與文件詳解
在職場中,Excel無疑是最核心的數(shù)據(jù)處理工具之一。然而,面對每周、每日都要重復(fù)的數(shù)據(jù)錄入、報表匯總和格式調(diào)整,人工操作不僅效率低下,還極易出錯。進(jìn)入我們學(xué)習(xí)計(jì)劃的第四階段(第36-50天),我們的核心目標(biāo)是讓機(jī)器人學(xué)會“讀寫算”,能夠高效處理Excel、PDF、CSV等常見辦公文檔。本文將作為本階段的開篇,深度聚焦于Python操作Excel的利器——openpyxl庫,帶你從零開始,掌握讀寫單元格、應(yīng)用公式、美化樣式、管理工作表乃至創(chuàng)建動態(tài)圖表的全套技能。
一、 為什么是openpyxl?—— 自動化辦公的第一選擇
在Python生態(tài)中,操作Excel的庫有很多,如pandas、xlrd/xlwt、xlwings等。但如果你需要處理的是現(xiàn)代Excel文件(.xlsx格式),且希望在保留原有格式的基礎(chǔ)上進(jìn)行讀寫,甚至操作圖表和樣式,openpyxl無疑是最佳通用選擇 。
核心優(yōu)勢:
- 原生支持.xlsx:專門針對Excel 2010及以后的版本設(shè)計(jì)。
- 保留樣式與公式:不同于某些僅處理數(shù)據(jù)的庫,openpyxl在修改單元格內(nèi)容時,能夠完美保留原有的字體、顏色、邊框和公式 。
- 功能全面:不僅支持讀寫數(shù)據(jù),還支持創(chuàng)建圖表、設(shè)置樣式、合并單元格、添加數(shù)據(jù)驗(yàn)證等高級功能 。
- 內(nèi)存優(yōu)化:對于大文件,openpyxl提供了只讀和只寫模式,可以有效降低內(nèi)存消耗。
在開始我們的“讀寫算”之旅前,請先確保你的環(huán)境中已安裝該庫。打開終端,輸入以下命令:
pip install openpyxl
二、 核心概念:工作簿、工作表、單元格
在開始編碼之前,理解openpyxl的三個核心層級至關(guān)重要。你可以把Excel文件想象成一本由若干頁紙組成的賬本 :
- 工作簿(Workbook):代表整個Excel文件(如“銷售報表.xlsx”)。這是最頂層的容器。
- 工作表(Worksheet):代表工作簿中的每一頁(如“Sheet1”、“一月數(shù)據(jù)”)。一個工作簿可以包含多個工作表。
- 單元格(Cell):工作表中最基本的存儲單元,由行和列的坐標(biāo)定位(如A1, B3)。
我們對Excel的所有操作,本質(zhì)上都是通過openpyxl創(chuàng)建或加載一個Workbook對象,然后從中獲取指定的Worksheet,最后對Worksheet中的Cell進(jìn)行讀寫或樣式設(shè)置。
三、讀寫單元格與公式應(yīng)用——讓Python學(xué)會“讀寫”
3.1 讀取Excel數(shù)據(jù):讓Python“看懂”表格
假設(shè)我們有一個現(xiàn)有的Excel文件“銷售數(shù)據(jù).xlsx”,我們需要讀取其中的數(shù)據(jù)。使用load_workbook()函數(shù)是讀取的起點(diǎn) 。
from openpyxl import load_workbook
# 1. 加載工作簿
workbook = load_workbook('銷售數(shù)據(jù).xlsx')
# 2. 獲取工作表 (通過名稱或活動表)
# sheet = workbook['Sheet1'] # 通過名稱
sheet = workbook.active # 獲取當(dāng)前活動的工作表
# 3. 讀取特定單元格的值
cell_a1 = sheet['A1'].value
print(f"A1單元格的內(nèi)容是:{cell_a1}")
# 或者使用cell方法,指定行和列 (行和列索引都從1開始)
cell_b2 = sheet.cell(row=2, column=2).value
print(f"B2單元格的內(nèi)容是:{cell_b2}")
# 4. 遍歷整個工作表的數(shù)據(jù)
print("--- 工作表全部數(shù)據(jù) ---")
for row in sheet.iter_rows(values_only=True): # values_only=True直接返回值,而不是cell對象
print(row)
# 操作完成后記得關(guān)閉工作簿釋放資源
workbook.close()
應(yīng)用場景:你可以將此代碼嵌入到每日的數(shù)據(jù)匯總?cè)蝿?wù)中,自動從多個部門發(fā)來的Excel中提取關(guān)鍵指標(biāo),無需手動打開每個文件查看 。
3.2 寫入數(shù)據(jù)與公式:讓Python“填寫”報表
僅僅讀取是不夠的,我們更需要自動生成報表。接下來,我們將創(chuàng)建一個新的工作簿,并寫入銷售數(shù)據(jù)。同時,我們將展示如何寫入Excel公式,讓Excel自動計(jì)算“總價”,實(shí)現(xiàn)“算”的功能 。
from openpyxl import Workbook
# 1. 創(chuàng)建一個新的工作簿
workbook = Workbook()
sheet = workbook.active
sheet.title = "手機(jī)銷售數(shù)據(jù)" # 重命名工作表
# 2. 寫入表頭
headers = ['銷售員', '產(chǎn)品', '銷量', '單價', '總價']
sheet.append(headers) # append方法可以方便地添加一行數(shù)據(jù)
# 3. 寫入原始數(shù)據(jù) (銷量和單價)
raw_data = [
['張三', 'iPhone 15', 10, 6000],
['李四', '小米14', 15, 4000],
['王五', '華為Mate 60', 8, 7000],
]
for row_data in raw_data:
sheet.append(row_data)
# 4. 寫入公式 (計(jì)算總價)
# 總價 = 銷量 * 單價。對于第一行數(shù)據(jù),銷量在C2單元格,單價在D2單元格,所以公式是 "=C2*D2"
sheet['E2'] = '=C2*D2'
sheet['E3'] = '=C3*D3'
sheet['E4'] = '=C4*D4'
# 為了讓效果更明顯,我們也可以使用循環(huán)批量寫入公式
# for i in range(2, 5):
# sheet[f'E{i}'] = f'=C{i}*D{i}'
# 5. 保存工作簿
workbook.save('手機(jī)銷售報表_生成.xlsx')
print("報表生成成功!")
運(yùn)行這段代碼,你會發(fā)現(xiàn)在生成的Excel文件中,“總價”列已經(jīng)自動計(jì)算出了正確的結(jié)果。這正是“讀寫算”中“算”的初步體現(xiàn)。通過Python寫入公式,我們讓Excel引擎承擔(dān)了計(jì)算工作,既準(zhǔn)確又高效 。
四、美化樣式——告別千篇一律的“黑白表格”
數(shù)據(jù)填充完畢,但一張專業(yè)的報表還需要清晰的格式。手動設(shè)置字體、對齊方式、背景色不僅枯燥,而且難以保證每次報表風(fēng)格一致。openpyxl提供了強(qiáng)大的styles模塊,讓Python替我們完成美化工作 。
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Border, Side, Alignment
# 創(chuàng)建工作簿和數(shù)據(jù)
workbook = Workbook()
sheet = workbook.active
sheet.title = "銷售數(shù)據(jù)報表"
# 準(zhǔn)備數(shù)據(jù)
headers = ['產(chǎn)品名稱', '銷量', '單價', '總價']
data = [
['鍵盤', 100, 120.00],
['鼠標(biāo)', 150, 80.50],
['顯示器', 50, 1200.00],
]
sheet.append(headers)
for row in data:
# 先添加數(shù)據(jù),總價列稍后用公式填充
sheet.append(row)
# 添加總價公式
sheet['D2'] = '=B2*C2'
sheet['D3'] = '=B3*C3'
sheet['D4'] = '=B4*C4'
# ----- 開始美化 -----
# 1. 設(shè)置標(biāo)題行樣式:加粗、藍(lán)色字體、黃色背景、居中
header_font = Font(name='微軟雅黑', bold=True, size=12, color='000000FF') # 藍(lán)色
header_fill = PatternFill(start_color='FFFF00', end_color='FFFF00', fill_type='solid') # 黃色
header_alignment = Alignment(horizontal='center', vertical='center')
for cell in sheet['1']: # 遍歷第一行的所有單元格
cell.font = header_font
cell.fill = header_fill
cell.alignment = header_alignment
# 2. 為數(shù)據(jù)區(qū)域添加邊框
thin_border = Border(
left=Side(style='thin'),
right=Side(style='thin'),
top=Side(style='thin'),
bottom=Side(style='thin')
)
for row in sheet.iter_rows(min_row=1, max_row=sheet.max_row, min_col=1, max_col=sheet.max_column):
for cell in row:
cell.border = thin_border
# 3. 設(shè)置貨幣格式 (單價和總價列)
from openpyxl.styles import numbers
for row in range(2, sheet.max_row + 1):
sheet[f'C{row}'].number_format = numbers.FORMAT_CURRENCY_CN # 人民幣格式
sheet[f'D{row}'].number_format = numbers.FORMAT_CURRENCY_CN
# 4. 調(diào)整列寬
sheet.column_dimensions['A'].width = 20
sheet.column_dimensions['B'].width = 10
sheet.column_dimensions['C'].width = 15
sheet.column_dimensions['D'].width = 15
workbook.save('手機(jī)銷售報表_美化.xlsx')
print("美化完成!")
通過以上代碼,我們批量設(shè)置了字體、背景色、邊框和數(shù)字格式。整個過程完全自動化,確保每個月的報表風(fēng)格完全一致,專業(yè)度瞬間提升 。
五、操作工作表與創(chuàng)建圖表——讓數(shù)據(jù)“可視化”
5.1 管理工作表
隨著業(yè)務(wù)復(fù)雜度增加,一個工作簿中往往包含多個工作表。openpyxl允許我們像操作Excel一樣,對工作表進(jìn)行創(chuàng)建、復(fù)制和刪除 。
from openpyxl import Workbook
workbook = Workbook()
# 默認(rèn)會有一個名為'Sheet'的工作表
# 1. 創(chuàng)建新工作表
sheet1 = workbook.create_sheet('產(chǎn)品銷售') # 默認(rèn)插在最后
sheet2 = workbook.create_sheet('銷售員績效', 0) # 指定位置,插在第一個(索引0)
# 2. 獲取所有工作表名稱
print(workbook.sheetnames) # 輸出: ['銷售員績效', 'Sheet', '產(chǎn)品銷售']
# 3. 刪除工作表
del workbook['Sheet'] # 刪除默認(rèn)的工作表
# 4. 復(fù)制工作表
if '產(chǎn)品銷售' in workbook.sheetnames:
source_sheet = workbook['產(chǎn)品銷售']
# 復(fù)制的工作表會自動命名,如'產(chǎn)品銷售 Copy'
workbook.copy_worksheet(source_sheet)
print(workbook.sheetnames) # 輸出: ['銷售員績效', '產(chǎn)品銷售', '產(chǎn)品銷售 Copy']
workbook.save('工作表操作示例.xlsx')
這一功能在需要根據(jù)模板批量生成報表時非常實(shí)用 。
5.2 創(chuàng)建圖表(數(shù)據(jù)可視化)
枯燥的數(shù)字很難讓人一眼看出趨勢。openpyxl支持直接在Excel中嵌入圖表,如柱狀圖、折線圖等。下面,我們基于前面的銷售數(shù)據(jù),創(chuàng)建一個銷售額的柱狀圖 。
from openpyxl import load_workbook
from openpyxl.chart import BarChart, Reference
# 加載我們之前美化過的文件
workbook = load_workbook('手機(jī)銷售報表_美化.xlsx')
sheet = workbook['銷售數(shù)據(jù)報表']
# 1. 創(chuàng)建一個柱狀圖對象
chart = BarChart()
chart.title = "產(chǎn)品銷售額分析"
chart.x_axis.title = "產(chǎn)品名稱"
chart.y_axis.title = "銷售額(元)"
# 2. 定義數(shù)據(jù)和分類的范圍
# 數(shù)據(jù):總價列的數(shù)據(jù) (D2:D4)
data = Reference(sheet, min_col=4, min_row=2, max_row=4)
# 分類:產(chǎn)品名稱列 (A2:A4) 作為X軸的標(biāo)簽
categories = Reference(sheet, min_col=1, min_row=2, max_row=4)
# 3. 將數(shù)據(jù)和分類添加到圖表
chart.add_data(data, titles_from_data=False) # titles_from_data=False表示數(shù)據(jù)區(qū)域不包含標(biāo)題
chart.set_categories(categories)
# 4. 將圖表插入到工作表,例如E1單元格的位置
sheet.add_chart(chart, 'E1')
workbook.save('手機(jī)銷售報表_含圖表.xlsx')
print("圖表創(chuàng)建成功!")
打開生成的Excel文件,你會看到一個直觀的柱狀圖已經(jīng)呈現(xiàn)在表格旁邊。圖表會隨著源數(shù)據(jù)的改變而自動更新。通過循環(huán),我們甚至可以一次性為多個數(shù)據(jù)列創(chuàng)建多個圖表 。這標(biāo)志著我們不僅能讓機(jī)器人“讀寫算”,還能讓它產(chǎn)出具有洞察力的可視化報告。
六、 實(shí)戰(zhàn)技巧:使用模板與注意事項(xiàng)
為了達(dá)到95分以上的高質(zhì)量自動化,我們還需要掌握一些高級技巧。
6.1 高效使用模板
在實(shí)際企業(yè)應(yīng)用中,更常見的做法不是用代碼從頭搭建報表,而是基于一個設(shè)計(jì)好的模板進(jìn)行填充 。這樣做的好處是:
- 格式分離:復(fù)雜的格式(Logo、頁眉頁腳、合并單元格、預(yù)定義樣式)可以在Excel中由專業(yè)設(shè)計(jì)師完成。
- 維護(hù)方便:如果需要修改報表樣式,只需修改模板文件,無需改動Python代碼。
實(shí)現(xiàn)步驟:
- 設(shè)計(jì)模板:在Excel中創(chuàng)建一個
template.xlsx文件,設(shè)置好所有靜態(tài)內(nèi)容、標(biāo)題、公式和占位符。 - 加載模板:
wb = openpyxl.load_workbook(‘template.xlsx’) - 填充數(shù)據(jù):定位到占位符區(qū)域(如
A2開始),用循環(huán)sheet.append(data)填充動態(tài)數(shù)據(jù)。 - 另存為新文件:
wb.save(‘月度報告_2025年7月.xlsx’)
這種方式完美地保留了模板中的所有樣式和靜態(tài)公式,是生成周報、月報的標(biāo)準(zhǔn)姿勢 。
6.2 避坑指南
- 僅支持.xlsx:openpyxl不能處理舊版的
.xls文件。如果遇到.xls,需要先另存為.xlsx或使用xlrd庫讀取 。 - 公式語言:寫入公式時,必須使用英文函數(shù)名和英文分隔符(逗號),因?yàn)閛penpyxl生成的是英文版的Excel公式。例如,求和要用
=SUM(A1:A10),而不是中文版的=求和(A1:A10)。 - 圖表更新:如果你用openpyxl打開一個含有圖表的模板,僅僅修改數(shù)據(jù)源后保存,圖表有時會丟失。最穩(wěn)妥的方法是,在代碼中重新創(chuàng)建圖表并綁定數(shù)據(jù),正如我們在5.2節(jié)所做的那樣 。
- 大文件性能:處理超大文件(幾十MB)時,默認(rèn)的加載模式會將整個文件讀入內(nèi)存,可能導(dǎo)致內(nèi)存溢出。此時應(yīng)考慮使用
read_only或write_only模式 。
七、 總結(jié)
通過本文的深度拆解,我們從零開始,完整地走通了openpyxl自動化Excel的四大核心步驟:
- 讀寫單元格:掌握了
load_workbook和Workbook的基本用法,實(shí)現(xiàn)了數(shù)據(jù)的輸入與輸出 。 - 應(yīng)用公式:學(xué)會了如何在單元格中寫入公式,讓Excel引擎完成計(jì)算任務(wù) 。
- 美化樣式:利用
Font、PatternFill、Border等組件,讓報表告別粗糙,走向?qū)I(yè) 。 - 高級操作:實(shí)現(xiàn)了工作表的創(chuàng)建與刪除,并成功創(chuàng)建了動態(tài)圖表,讓數(shù)據(jù)可視化變得觸手可及 。
到此這篇關(guān)于Python使用openpyxl自動化處理Excel數(shù)據(jù)與文件詳解的文章就介紹到這了,更多相關(guān)Python openpyxl處理Excel內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于Python的EasyGUI學(xué)習(xí)實(shí)踐
這篇文章主要介紹了基于Python的EasyGUI學(xué)習(xí)實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05
使用matplotlib在Python中繪制數(shù)據(jù)的詳細(xì)教程
Python 在處理數(shù)據(jù)方面非常出色,通常,數(shù)據(jù)集 會包括多個變量和許多實(shí)例,這使得很難理解數(shù)據(jù)的情況,數(shù)據(jù)可視化是幫助您識別數(shù)據(jù)模式的一種有用方式,本教程將描述如何使用 matplotlib 在 Python 中繪制數(shù)據(jù),需要的朋友可以參考下2024-10-10
實(shí)例講解Python中SocketServer模塊處理網(wǎng)絡(luò)請求的用法
SocketServer模塊中帶有很多實(shí)現(xiàn)服務(wù)器所能夠用到的socket類和操作方法,下面我們就來以實(shí)例講解Python中SocketServer模塊處理網(wǎng)絡(luò)請求的用法:2016-06-06
TensorFlow深度學(xué)習(xí)另一種程序風(fēng)格實(shí)現(xiàn)卷積神經(jīng)網(wǎng)絡(luò)
這篇文章主要介紹了TensorFlow卷積神經(jīng)網(wǎng)絡(luò)的另一種程序風(fēng)格實(shí)現(xiàn)方式示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-11-11

