Python openpyxl Excel 自動化處理教學:告別重複的手動操作
劉芷晴9 分鐘閱讀
每個月都要手動整理 Excel 報表的痛苦,我太懂了。上一份工作的時候,光是每月彙整各部門的銷售數據就要花掉整整一個下午。後來我用 Python 寫了一個自動化腳本,15 分鐘的工作量縮到了 30 秒。今天就來分享怎麼用 openpyxl 做到這件事。
為什麼要用 Python 自動化 Excel?
理由很簡單:
- 重複性的操作可以一鍵完成
- 減少人為錯誤(複製貼上的時候手滑過的請舉手)
- 可以排程定時執行,完全無人值守
- 腳本可以重複使用、分享給同事
如果你已經會 Python 基礎,openpyxl 的學習曲線非常平緩,通常半天就能上手。
安裝與環境設定
pip install openpyxl
安裝完就可以開始了。如果你還沒設定好 Python 虛擬環境,建議先看看 Python 網頁爬蟲教學 裡面的環境設定章節。
讀取 Excel 檔案
先來認識 openpyxl 的三個核心概念:
- Workbook:整個 Excel 檔案
- Worksheet:工作表(分頁)
- Cell:儲存格,用 (row, column) 座標定位
from openpyxl import load_workbook
# 載入已存在的 Excel 檔案
wb = load_workbook('sales_data.xlsx')
# 取得作用中的工作表
ws = wb.active
# 也可以用名字指定
ws = wb['Sheet1']
# 讀取單一儲存格
print(ws['A1'].value) # 用 Excel 風格的座標
print(ws.cell(row=1, column=1).value) # 用數字座標
# 遍歷所有行
for row in ws.iter_rows(min_row=2, values_only=True):
name, quantity, price = row[0], row[1], row[2]
print(f'{name}: {quantity} x {price}')
寫入資料到 Excel
建立一個新的 Excel 檔案也非常簡單:
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
ws.title = '銷售報表'
# 寫入標題列
headers = ['產品名稱', '數量', '單價', '小計']
ws.append(headers)
# 寫入資料
data = [
['鍵盤', 50, 1200, '=B2*C2'],
['滑鼠', 80, 450, '=B3*C3'],
['螢幕', 20, 8500, '=B4*C4'],
]
for row in data:
ws.append(row)
# 加入合計公式
ws.append(['', '', '合計', '=SUM(D2:D4)'])
wb.save('monthly_report.xlsx')
print('報表已產生!')
格式化儲存格
讓報表更專業,加上字型、顏色和框線:
from openpyxl.styles import Font, PatternFill, Border, Side, Alignment
# 標題樣式
header_font = Font(name='微軟正黑體', size=12, bold=True, color='FFFFFF')
header_fill = PatternFill(start_color='2563EB', end_color='2563EB', fill_type='solid')
thin_border = Border(
left=Side(style='thin'),
right=Side(style='thin'),
top=Side(style='thin'),
bottom=Side(style='thin')
)
# 套用到標題列
for cell in ws[1]:
cell.font = header_font
cell.fill = header_fill
cell.alignment = Alignment(horizontal='center')
cell.border = thin_border
# 設定欄寬
ws.column_dimensions['A'].width = 15
ws.column_dimensions['B'].width = 10
ws.column_dimensions['C'].width = 10
ws.column_dimensions['D'].width = 12
# 數字格式
for row in ws.iter_rows(min_row=2, min_col=3, max_col=4):
for cell in row:
cell.number_format = '#,##0'
cell.border = thin_border
wb.save('formatted_report.xlsx')
實戰專案:自動化月度銷售報表
把以上學到的技巧整合起來,做一個完整的自動化報表產生器:
import os
from datetime import datetime
from openpyxl import Workbook, load_workbook
from openpyxl.styles import Font, PatternFill, Alignment
from openpyxl.chart import BarChart, Reference
def generate_monthly_report(data_file, output_dir='reports'):
"""從原始資料產生月度報表"""
os.makedirs(output_dir, exist_ok=True)
# 讀取原始資料
raw = load_workbook(data_file)
raw_ws = raw.active
# 建立新報表
wb = Workbook()
ws = wb.active
ws.title = f'{datetime.now().strftime("%Y年%m月")} 銷售報表'
# 彙整資料
sales_by_product = {}
for row in raw_ws.iter_rows(min_row=2, values_only=True):
product, qty, price = row[0], row[1], row[2]
if product not in sales_by_product:
sales_by_product[product] = {'qty': 0, 'revenue': 0}
sales_by_product[product]['qty'] += qty
sales_by_product[product]['revenue'] += qty * price
# 寫入彙整資料
ws.append(['產品', '總銷量', '總營收'])
for product, data in sorted(sales_by_product.items()):
ws.append([product, data['qty'], data['revenue']])
# 加入圖表
chart = BarChart()
chart.title = '各產品營收'
chart.y_axis.title = '營收 (NTD)'
data_ref = Reference(ws, min_col=3, min_row=1,
max_row=len(sales_by_product) + 1)
cats = Reference(ws, min_col=1, min_row=2,
max_row=len(sales_by_product) + 1)
chart.add_data(data_ref, titles_from_data=True)
chart.set_categories(cats)
ws.add_chart(chart, 'E2')
# 儲存
filename = f'report_{datetime.now().strftime("%Y%m")}.xlsx'
filepath = os.path.join(output_dir, filename)
wb.save(filepath)
return filepath
# 使用方式
# report = generate_monthly_report('raw_sales.xlsx')
# print(f'報表已存到: {report}')
如果你想讓這個腳本定時自動執行,可以搭配 Python APScheduler 排程教學 來實現完全自動化。
openpyxl vs xlsxwriter vs pandas
三個套件各有擅長:
- openpyxl:讀寫都行,支援修改現有檔案,適合一般場景
- xlsxwriter:只能寫入(不能讀取),但圖表和格式化功能更強大
- pandas:適合大量資料的分析和轉換,底層可以搭配 openpyxl 或 xlsxwriter
如果你需要做更複雜的資料分析,建議搭配 Pandas 資料分析教學 一起學。
結語
openpyxl 是 Python 處理 Excel 最全面的套件。掌握了讀取、寫入、格式化這三個技能,你就能自動化絕大多數的 Excel 工作。開始寫你的第一個自動化腳本吧,你的同事會感謝你的。
繼續閱讀
Python AI Agent 開發入門:用 LangChain 打造你的第一個自動化智能助手
相關文章
你可能也喜歡
探索其他領域的精選好文