xlwings 讓你的 Excel 飛起來
xlwings 讓你的 Excel 飛起來
簡介
眾所周知,VBA 可以很高效的操作 Excel,提高辦公效率。在 Python 中,我們可以通過 pywin32 來調用 windows 系統的 API 來實現 VBA 的很多功能,但是寫起來比較複雜。
開始之前, 回憶一下使用 Excel 的場景。
我們會同時打開多個 Excel 文件, 多個 workbook, 每個 workbook 又可以用多個 sheet。同時,我們還會在多個 sheet workbook Excel 窗口之間切換。
對一個或多個單元格進行增刪改查,設置格式,合併分拆等操作。利用 xlwings 這些操作都可以輕鬆搞定,一次編寫徹底解決」手抽筋的問題」xlwings 是基於 BSD-licensed 的一個 Python 第三方的模塊,對 pywin32 進行了封裝,可以很方便的和 Excel 進行交互,它有以下優點:
- 語法接近 VBA
- 可以用 Python 代碼取代 VBA 編寫宏
- 在 windows 可以用 Python 編寫 Excel 用戶自定義函數
- 全功能支持 Numpy Pandas matplotlib 等科學計算庫
- 支持 Windows 和 MacOS
- 支持 Py2.7 Py3.3+
xlwings 可以讓你的 Excel 飛起來,正如 Selenium 可以讓你的瀏覽器飛起來一樣。
安裝
推薦使用 Anaconda Download Anaconda Now! 來安裝,可以省去很多麻煩,
conda install xlwings使用 pip 安裝,需要先手動安裝 pywin32 下載地址https://sourceforge.net/projects/pywin32/files/pywin32/安裝 pywin32 後,使用 pip 安裝即可
pip install xlwings
官方安裝文檔
Installation - xlwings 0.10.4 documentation快速入門
打開工作表
import xlwings as xwn# 打開一個新的 workbook nwb = xw.Book()n# 打開當前目錄已經存在的一個 workbook nwb = xw.Book(FileName.xlsx)nn# 輸入完整的路徑打開一個 workbook nFileName = "C:pythontofile.xlsx"nFileName = r"C:pythontofile.xlsx"n# 注意 windows 字元 "" 逃逸的問題nwb = xw.Book(fn)n
打開 sheet 的三種方式
# 打開第一個 sheetnsheet = wb.sheets[0]n# 打開名字為 "xchaoinfo" sheetnsheet = wb.sheets["xchaoinfo"]n# 打開當前活動的 sheetnsheet = wb.sheets.activen
讀寫數據到 sheet 中
# 當前活動的 sheet 中讀寫一個單元格的數據n>>> import xlwings as xwn>>> wb = xw.Book()n>>> sht = wb.sheets.activen>>> sht.range(A1).value = "xchaoinfo"n>>> sht.range(A1).valuenxchaoinfon# 當前活動的 sheet 中讀寫一行單元格的數據n# 將列表儲存在A1:C1中n>>> sht.range(A1).value=["name","age","gender"]n>>> sht.range(A1:C1).valuen[name, age, gender]n# 當前活動的 sheet 中讀寫一列單元格的數據n# 將列表儲存在A1:A3中n>>> sht.range(A1).options(transpose=True).value=["xchaoinfo",18,1]n>>> sht.range("A1:A3").valuen[xchaoinfo, 18.0, 1.0]n>>> sht.range(A1:A3).value = ["Robot", 20, 2]n>>> sht.range("A1:A3").valuen[Robot, 18.0, 1.0]n# 當前活動的 sheet 中讀寫多行多列單元格的數據n# 將2x2表格,即二維數組,儲存在A1:B2中,如第一行1,2,第二行3,4n>>> wb = xw.Book()n>>> sht = wb.sheets.activen>>> sht.range(A1).options(expand=table).value=[[1,2],[3,4]]n>>> sht.range("A1").expand().valuen[[1.0, 2.0], [3.0, 4.0]]n# expand 的詳細用法請參考文檔n>>> sht.range(A1:B2).value = [[1,2],[3,4]]n>>> sht.range(A1:B2).valuen[[1.0, 2.0], [3.0, 4.0]]n
應用實例
刪除 Excel 文件中,滿足條件的單元格所在的一整行
#!/usr/bin/env python3n# -*- coding: utf-8 -*-n# @Date : 2017-03-16 14:14:03n# @Author : xchaoinfo (xchaoinfo)n# @github : xchaoinfo (xchaoinfo)nnimport xlwings as xwnnfn = "data.xlsx"nnclass DeleteTools(object):n """刪除滿足某些條件的行n data.xlsx 中有很多重複的數據n 需要刪除那些重複的n """nn def __init__(self, fn):n super(DeleteTools, self).__init__()n self.ExistSet = set()n self.ToDelList = list()n self.fn = fnnn def rule(self, value):n # 可以自定義規則來操作n passnn def Delete(self):n # visible 控制 Excel 打開是否顯示界面n # add_book 控制是否添加新的 workbookn app = xw.App(visible=True, add_book=False)n # app.display_alerts = Falsenn # 打開 data.xlsx 文件到 wookbook 中n wb = app.books.open(fn)n # 切換到當前活動的 sheet 中n sheet = wb.sheets.activenn # 選擇 A1 所在的一列n # 當 Excel 格式複雜的時候,不建議使用 expandn # 可以這樣選擇n ARange = sheet.range("A1:A100")n # ARange = sheet.range("A1").expand("down")n for A in ARange:n if str(A.value).strip() not in self.ExistSet:n self.ExistSet.add(str(A.value).strip())n else:n # address = A.addressn # 獲取 A 所在的位置坐標n self.ToDelList.append(A.address)n # print(A.value)nn while self.ToDelList:n td = self.ToDelList.pop()n # 刪除 A 所在的一行n sheet.range(td).api.EntireRow.Delete()n # 保存 wookbookn # 相當於Excel 的 Ctrl+S 快捷鍵n sheet.autofit()n wb.save()n app.quit()nnif __name__ == __main__:n d = DeleteTools(fn)n d.Delete()n
參考
插上翅膀,讓Excel飛起來——xlwings(一)
xlwings - Make Excel Fly!更多內容詳見官方文檔
文中的代碼示例可以在 github 上找到 xchaoinfo/Py-example-by-xchaoinfo
首發於微信公眾號:xchaoinfo
推薦閱讀:
※excel表格百萬數據如何查重?
※vlookup為什麼這樣寫不對?
※excel裡面的VLOOKUP和LOOKUP有什麼區別?
※Excel中同一工作表內使用「插入剪切的單元格」功能如何始終保持原始列寬?
※我在excel某格子里輸入一個公式,設置一個變數,以後只輸入變數就好了?
