Python 操作 Excel 可能是自動化辦公最火熱的需求了,看一看公衆号文章底部的視訊廣告就知道了,裡面盡是一些 5 分鐘搞定 excel,将資料生成漂亮的圖表。
5 分鐘雖然有些誇張,但是快速操作 Excel 的需求确是真的。今天就來分享如何使用 Python 玩轉 Excel。
主要内容:
- Python 操作 Excel 的輪子對比
- xlwings 讀 Excel
- xlwings 寫 Excel
- Excel 中插入圖表
- Excel 轉 Pdf
- Excel 拆分與合并
- Excel 轉 REST API
Python 操作 Excel 的輪子
Python 操作 Excel 的輪子有很多,導緻選擇困難症,為了幫你做選擇,我這裡放個對比圖:
從上面的表格中可以看出,xlwings 是唯一一個全部都支援️的,是 Python 最強大的處理 Excel 的庫,今天的主角就是它,它有以下優點
- 1、Windows、Mac 都能用,Excel、WPS 也都能用。
- 2、功能齊全,支援 Excel 的建立、打開、修改、儲存,pandas、xlsxwriter 不能全做到。
- 3、文法簡單,用過一次後我就記住了。
- 4、可以調用 VBA,有豐富的 API。
- 5、可以與 pandas 等類庫內建使用。
xlwings 安裝
pip install xlwings
需要注意的是,請使用作業系統自帶的終端來運作 xlwings 程式,否則可能遇到權限不足的問題。
xlwings 讀取 Excel
讀取 excel 比較簡單,比如現在有這樣一個 excel:
先确定範圍,這裡是 A1 到 F4,多讀一些也沒關系,沒有資料的格子會顯示為 None。
import xlwings as xw
work_book = xw.Book('測試.xlsx')
sheet1 = work_book.sheets[0]
print(sheet1.book)
c = 0
for cell in sheet1.range('A1','E6'):
c += 1
print(cell.value, end ='\t')
if c % 5 == 0:
print("")
執行結果如下圖所示:
假如無法預知資料的範圍,可以使用 last_cell 方式擷取最下邊且最右邊的一個單元格。
比如更好的方式是這樣寫:
import xlwings as xw
work_book = xw.Book('測試.xlsx')
sheet1 = work_book.sheets[0]
print(sheet1.book)
last_cell = sheet1.used_range.last_cell
last_row = last_cell.row
last_col = last_cell.column
c = 0
for cell in sheet1.range((1,1),(last_row, last_col)):
c += 1
print(cell.value, end ='\t')
if c % last_col == 0:
print("")
還有各種靈活的單元格通路方式:
# A1單元格
rng=sheet1['A1']
rng=sheet1['a1']
# A1:B5單元格
rng=sheet1['A1:B5']
# 第一行的第一列即a1
rng=sheet1[0,0]
# B1單元格
rng=sheet1[0,1]
在讀取到每一行,每一列的資料之後,我們就可以對這些資料進行加工,然後寫回 excel 了。
xlwings 寫入 Excel
現在來實作一個小小的需求:針對上述讀取的 Excel,我們現在來統計分數的總和及平均數,并寫入 Excel 的最後行。
import xlwings as xw
work_book = xw.Book('測試.xlsx')
sheet1 = work_book.sheets[0]
print(sheet1.book)
#last_cell = sheet1.used_range.last_cell
last_row = 4
last_col = 5
## 擷取分數的列索引
score_col_index = ""
for cell in sheet1.range((1,1),(1,last_col)):
if cell.value == '分數':
score_col_index = cell.column
## 将分數存入清單
score_list = []
for row in range(2,last_row+1):
cell = sheet1.range((row,score_col_index))
score_list.append(cell.value)
print(score_list)
sum_score = sum(score_list)
avg_score = sum(score_list) / len(score_list)
## 計算出結果後寫入 excel
sheet1.range((last_row + 1,1)).value = "合計"
sheet1.range((last_row + 1,last_col)).value = sum_score
sheet1.range((last_row + 2,1)).value = "平均值"
sheet1.range((last_row + 2,last_col)).value = round(avg_score,2)
work_book.save()
work_book.close()
代碼的邏輯非常簡單,首先擷取分數所在的列,然後将所有的分數取出來儲存在清單中,對其求和,求平均值,然後寫回 Excel 的最後一行。
生成圖表在 Excel 也是很常見的需求,除了可以用 Excel 本身的圖表之外,還可以借助 Python 來插入圖表。
比如說現在有一個股票的資料,我們用 Python 生成該股票的走勢圖,并插入到 Excel 中。
這裡借助了 pandas 庫,使用前請
pip install pandas
安裝一下。
import xlwings as xw
import pandas as pd
wb = xw.Book('300369.xlsx')
sheet1 = wb.sheets[0]
print(sheet1.range('A1:D3').value)
data_frame = sheet1.range('A1:D354').options(pd.DataFrame).value
data_frame.drop(columns = ["股票代碼","名稱"],inplace = True)
print(data_frame.head())
ax = data_frame.plot()
fig = ax.get_figure()
sheet1.pictures.add(fig, name = '綠盟科技', update = True)
wb.save()
最終的效果如下:
将一個工作簿轉換為 Pdf 非常簡單,一行代碼就可以搞定:
import xlwings as xw
wb = xw.Book('300369.xlsx')
sheet1 = wb.sheets[0]
sheet1.to_pdf(path= '300369.pdf')
拆分與合并
現在,我們來解決這個問題:如何快速地批量處理内容相似的 Excel?
批量拆分: 假設你是公司的财務人員,你需要使用 Excel 對員工工資進行核算,之後再列印出來。但是公司要求員工薪水保密,是以每個員工的工資需要拆分成一個獨立的檔案,最後再轉成 pdf 通過郵件發送出去。
excel 内容大緻如下:
拆分後:
代碼如下:
import xlwings as xw
work_book = xw.Book('excel拆分練習.xlsx')
sheet1 = work_book.sheets[0]
print(sheet1.book)
last_cell = sheet1.used_range.last_cell
last_row = last_cell.row
last_col = last_cell.column
"""
定義緩存
"""
head_titles = []
rows_content = []
for i in range(last_row - 1):
rows_content.append([])
"""
讀取 excel 内容至緩存
"""
for cell in sheet1.range((1,1),(1, last_col)):
head_titles.append(cell.value)
col_index = 0
row_index = 0
for cell in sheet1.range((2,1),(last_row, last_col)):
rows_content[row_index].append(cell.value)
col_index += 1
if col_index % last_col == 0:
row_index += 1
col_index = 0
"""
将緩存寫入 excel
"""
# 周遊 rows_content
for index, row in enumerate(rows_content):
work_book = xw.Book()
sheet1 = work_book.sheets[0]
for col_index, col in enumerate(row):
sheet1.range((1,col_index + 1)).value = head_titles[col_index]
sheet1.range((2,col_index + 1)).value = col
work_book.save(f'{row[0]}.xlsx')
work_book.close()
批量合并。假設你需要對某些工作内容進行問卷調查,這時你用 Excel 做了調查問卷模版。我想你會這樣做:先把 Excel 通過工作群分發給所有員工,再把群裡收集到的回報附件彙總成一個檔案。
現在你可以仿照上面拆分的方法來進行批量合并。
将 excel 内容轉為 REST API
執行:
xlwings restapi run -host 0.0.0.0 -p 5000
就可以将已打開的 excel 檔案内容轉換為 REST API 接口:
然後就可以遠端通路:
最後的話
xlwings 很強大,本文抛磚引玉,如果經常使用的話,還是到官方文檔[1]去擷取更多方法。
另外本文的代碼及樣例檔案:https://gitee.com/somenzz/code-example/tree/master/excel[2]。
都看到這裡來了,說明你也是個愛學習的人,點贊在看支援一下吧,如果還沒關注的話,可以關注一下,順手學個 Python 實用技巧。感謝關注。
留言讨論
參考資料
[2]