天天看點

Python自動化辦公-讓 Excel 飛起來

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 的輪子有很多,導緻選擇困難症,為了幫你做選擇,我這裡放個對比圖:

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:

Python自動化辦公-讓 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("")
           

執行結果如下圖所示:

Python自動化辦公-讓 Excel 飛起來

假如無法預知資料的範圍,可以使用 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 中。

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()

           

最終的效果如下:

Python自動化辦公-讓 Excel 飛起來

将一個工作簿轉換為 Pdf 非常簡單,一行代碼就可以搞定:

import xlwings as xw

wb = xw.Book('300369.xlsx')
sheet1 = wb.sheets[0]
sheet1.to_pdf(path= '300369.pdf')
           

拆分與合并

現在,我們來解決這個問題:如何快速地批量處理内容相似的 Excel?

批量拆分: 假設你是公司的财務人員,你需要使用 Excel 對員工工資進行核算,之後再列印出來。但是公司要求員工薪水保密,是以每個員工的工資需要拆分成一個獨立的檔案,最後再轉成 pdf 通過郵件發送出去。

excel 内容大緻如下:

Python自動化辦公-讓 Excel 飛起來

拆分後:

Python自動化辦公-讓 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 接口:

Python自動化辦公-讓 Excel 飛起來

然後就可以遠端通路:

Python自動化辦公-讓 Excel 飛起來

最後的話

xlwings 很強大,本文抛磚引玉,如果經常使用的話,還是到官方文檔[1]去擷取更多方法。

另外本文的代碼及樣例檔案:https://gitee.com/somenzz/code-example/tree/master/excel[2]。

都看到這裡來了,說明你也是個愛學習的人,點贊在看支援一下吧,如果還沒關注的話,可以關注一下,順手學個 Python 實用技巧。感謝關注。

留言讨論

參考資料

[2]