xlwings使用教程
(一)
python操作Excel的模塊,網上提到的模塊大致有:xlwings、xlrd、xlwt、openpyxl、pyxll等,他們提供的功能歸納起來有兩種:一、用python讀寫Excel文件,實際上就是讀寫有格式的文本文件,操作excel文件和操作text、csv文件沒有區別,Excel文件只是用來儲存數據。二、除了操作數據,還可以調整Excel文件的表格寬度、字體顏色等。另外需要提到的是用COM調用Excel的API操作Excel文檔也是可行的,相當麻煩基本和VBA沒有區別。
xlwings官網.png
xlwings的特色
- xlwings能夠非常方便的讀寫Excel文件中的數據,並且能夠進行單元格格式的修改
- 可以和matplotlib以及pandas無縫連接
- 可以調用Excel文件中VBA寫好的程序,也可以讓VBA調用用Python寫的程序。
- 開源免費,一直在更新
基本操作
xlwings基本對象
- 打開已保存的Excel文檔
# 導入xlwings模塊,打開Excel程序,默認設置:程序可見,只打開不新建工作薄,屏幕更新關閉
import xlwings as xw
app=xw.App(visible=True,add_book=False)
app.display_alerts=False
app.screen_updating=False
# 文件位置:filepath,打開test文檔,然后保存,關閉,結束程序
filepath=r'g:\Python Scripts\test.xlsx'
wb=app.books.open(filepath)
wb.save()
wb.close()
app.quit() - 新建Excel文檔,命名為test.xlsx,並保存在D盤。
import xlwings as xw
app=xw.App(visible=True,add_book=False)
wb=app.books.add()
wb.save(r'd:\test.xlsx')
wb.close()
app.quit() - 在單元格輸入值
新建test.xlsx,在sheet1的第一個單元格輸入 “人生” ,然后保存關閉,退出Excel程序。
import xlwings as xw
app=xw.App(visible=True,add_book=False)
wb=app.books.add()
# wb就是新建的工作簿(workbook),下面則對wb的sheet1的A1單元格賦值
wb.sheets['sheet1'].range('A1').value='人生'
wb.save(r'd:\test.xlsx')
wb.close()
app.quit()
打開已保存的test.xlsx,在sheet2的第二個單元格輸入“苦短”,然后保存關閉,退出Excel程序
import xlwings as xw
app=xw.App(visible=True,add_book=False)
wb=app.books.open(r'd:\test.xlsx')
# wb就是新建的工作簿(workbook),下面則對wb的sheet1的A1單元格賦值
wb.sheets['sheet1'].range('A1').value='苦短'
wb.save()
wb.close()
app.quit()
掌握以上代碼,已經完全可以把Excel當作一個txt文本進行數據儲存了,也可以讀取Excel文件的數據,進行計算后,並將結果保存在Excel中。
引用工作簿、工作表和單元格
- 引用工作簿,注意工作簿應該首先被打開
wb.=xw.books['工作簿的名字‘] - 引用活動工作簿
wb=xw.books.active - 引用工作簿中的sheet
sht=xw.books['工作簿的名字‘].sheets['sheet的名字']
# 或者
wb=xw.books['工作簿的名字']
sht=wb.sheets[sheet的名字] - 引用活動sheet
sht=xw.sheets.active - 引用A1單元格
rng=xw.books['工作簿的名字‘].sheets['sheet的名字']
# 或者
sht=xw.books['工作簿的名字‘].sheets['sheet的名字']
rng=sht.range('A1') - 引用活動sheet上的單元格
# 注意Range首字母大寫
rng=xw.Range('A1')
其中需要注意的是單元格的完全引用路徑是:
# 第一個Excel程序的第一個工作薄的第一張sheet的第一個單元格
xw.apps[0].books[0].sheets[0].range('A1')
迅速引用單元格的方式是
sht=xw.books['名字'].sheets['名字']
# A1單元格
rng=sht[’A1']
# A1:B5單元格
rng=sht['A1:B5']
# 在第i+1行,第j+1列的單元格
# B1單元格
rng=sht[0,1]
# A1:J10
rng=sht[:10,:10]
PS: 對於單元格也可以用表示行列的tuple進行引用
# A1單元格的引用
xw.Range(1,1)
#A1:C3單元格的引用
xw.Range((1,1),(3,3))
儲存數據
- 儲存單個值
# 注意".value“
sht.range('A1').value=1 - 儲存列表
# 將列表[1,2,3]儲存在A1:C1中
sht.range('A1').value=[1,2,3]
# 將列表[1,2,3]儲存在A1:A3中
sht.range('A1').options(transpose=True).value=[1,2,3]
# 將2x2表格,即二維數組,儲存在A1:B2中,如第一行1,2,第二行3,4
sht.range('A1').options(expand='table')=[[1,2],[3,4]]
讀取數據
- 讀取單個值
# 將A1的值,讀取到a變量中
a=sht.range('A1').value - 將值讀取到列表中
#將A1到A2的值,讀取到a列表中
a=sht.range('A1:A2').value
# 將第一行和第二行的數據按二維數組的方式讀取
a=sht.range('A1:B2').value
(二)
在上一篇插上翅膀,讓Excel飛起來——xlwings(一)中提到利用xlwings模塊,用python操作Excel有如下的優點:
- xlwings能夠非常方便的讀寫Excel文件中的數據,並且能夠進行單元格格式的修改
- 可以和matplotlib以及pandas無縫連接
- 可以調用Excel文件中VBA寫好的程序,也可以讓VBA調用用Python寫的程序。
- 開源免費,一直在更新
本文緊接着上文介紹了xlwings模塊一些常用的api
xlwings基本對象
常用函數和方法
- Book 工作簿常用的api
wb=xw.books[‘工作簿名稱']- wb.activate()激活為當前工作簿
- wb.fullname 返回工作簿的絕對路徑
- wb.name 返回工作簿的名稱
- wb.save(path=None) 保存工作簿,默認路徑為工作簿原路徑,若未保存則為腳本所在的路徑
-wb. close() 關閉工作簿
代碼例子:
# 引用Excel程序中,當前的工作簿
wb=xw.books.acitve
# 返回工作簿的絕對路徑
x=wb.fullname
# 返回工作簿的名稱
x=wb.name
# 保存工作簿,默認路徑為工作簿原路徑,若未保存則為腳本所在的路徑
x=wb.save(path=None)
# 關閉工作簿
x=wb.close()
- sheet 常用的api
# 引用某指定sheet
sht=xw.books['工作簿名稱'].sheets['sheet的名稱']
# 激活sheet為活動工作表
sht.activate()
# 清除sheet的內容和格式
sht.clear()
# 清除sheet的內容
sht.contents()
# 獲取sheet的名稱
sht.name
# 刪除sheet
sht.delete - range常用的api
# 引用當前活動工作表的單元格
rng=xw.Range('A1')
# 加入超鏈接
# rng.add_hyperlink(r'www.baidu.com','百度',‘提示:點擊即鏈接到百度')
# 取得當前range的地址
rng.address
rng.get_address()
# 清除range的內容
rng.clear_contents()
# 清除格式和內容
rng.clear()
# 取得range的背景色,以元組形式返回RGB值
rng.color
# 設置range的顏色
rng.color=(255,255,255)
# 清除range的背景色
rng.color=None
# 獲得range的第一列列標
rng.column
# 返回range中單元格的數據
rng.count
# 返回current_region
rng.current_region
# 返回ctrl + 方向
rng.end('down')
# 獲取公式或者輸入公式
rng.formula='=SUM(B1:B5)'
# 數組公式
rng.formula_array
# 獲得單元格的絕對地址
rng.get_address(row_absolute=True, column_absolute=True,include_sheetname=False, external=False)
# 獲得列寬
rng.column_width
# 返回range的總寬度
rng.width
# 獲得range的超鏈接
rng.hyperlink
# 獲得range中右下角最后一個單元格
rng.last_cell
# range平移
rng.offset(row_offset=0,column_offset=0)
#range進行resize改變range的大小
rng.resize(row_size=None,column_size=None)
# range的第一行行標
rng.row
# 行的高度,所有行一樣高返回行高,不一樣返回None
rng.row_height
# 返回range的總高度
rng.height
# 返回range的行數和列數
rng.shape
# 返回range所在的sheet
rng.sheet
#返回range的所有行
rng.rows
# range的第一行
rng.rows[0]
# range的總行數
rng.rows.count
# 返回range的所有列
rng.columns
# 返回range的第一列
rng.columns[0]
# 返回range的列數
rng.columns.count
# 所有range的大小自適應
rng.autofit()
# 所有列寬度自適應
rng.columns.autofit()
# 所有行寬度自適應
rng.rows.autofit() - books 工作簿集合的api
# 新建工作簿
xw.books.add()
# 引用當前活動工作簿
xw.books.active - sheets 工作表的集合
# 新建工作表
xw.sheets.add(name=None,before=None,after=None)
# 引用當前活動sheet
xw.sheets.active
實例
大Z老師,教了小z同學怎么用python操作Excel之后,利用第一篇和第二篇的知識,編寫了一個python小腳本,給小Z同學演示了一下怎么用python調整單元格的行寬、列寬和背景色,做一些Interesting的事。
大Z老師的作品.png
小Z同學在看了這么cliche但是好玩的東西之后,自己果斷地修改了代碼,改變了單元格的顏色,並在sheet里面進行了題字,然后,便有新的作品:
小z的作品.png
下一課有機會教小z同學,利用python自帶的time模塊,讓Excel中靜態的畫和字動起來,成為像gif一樣的圖片。
(三)
【劇情回顧】
-
xlwings基本對象
xlwings基本對象
App相當於Excel程序,Book相當於工作簿。N個Excel程序則由apps表示,N個工作簿由books表示。
- 對工作簿的操作
-
-
import xlwings as xw
-
-
xw.Book()
-
-
xw.Book( '工作簿3')
-
-
xw.books[ '工作簿3’]
-
-
xw.Book(r 'e:\myworkbook.xlsx')
- 對sheet以及Range的操作
-
import xlwings as xw
-
wb=xw.Book()
-
# 引用名字為"sheet2"的sheet
-
sht=wb.sheets[ 'sheet2']
-
# 引用"sheet2"中的B1單元格
-
rng=sht.range( 'B1')
-
# 將B1單元格的值改為666
-
rng.value= 666
數據結構
- 一維數據
python的列表,可以和Excel中的行列進行數據交換,python中的一維列表,在Excel中默認為一行數據
-
import xlwings as xw
-
sht=xw.sheets.active
-
-
sht.range( 'A1').value=[1,2,3]
-
-
list1=sht.range( 'A1:C1').value
-
-
sht.range( 'A1').options(transpose=True).value=[1,2,3]
-
-
list1=sht.range( 'A1:A3').value
- 二維數據
python的二維列表,可以轉換為Excel中的行列。二維列表,即列表中的元素還是列表。在Excel中,二維列表中的列表元素,代表Excel表格中的一列。例如:
-
-
list1=[[‘a1’, 'a2','a3'],['b1','b2','b3']]
-
sht.range( 'A1').value=list1
運行結果
-
-
list1=sht.range( 'A1:B3‘).value
- Excel中區域的選取表格
-
-
rng=sht. range( 'A1').expand('down')
-
rng. value=['a1','a2','a3']
第一列
-
# 選取第一行
-
rng=sht.range( 'A1').expand('right')
-
rng=[ 'a1','b1']
第一行
-
-
rng.sht.range( 'A1').expand('table')
-
rng. value=[[‘a1’,'a2','a3'],['b1','b2','b3']]
表格
結束
- 本文首先簡單介紹了,通過Python運用xlwings模塊,對Excel工作簿、工作表和單元格的操作。
- 再介紹了xlwings,如何對Excel表格的行和列寫入和引用數據
- 通過二維或者一維列表對Excel工作表的數據進行寫入或者引用,既簡化了代碼,也提高了程序的效率。因為python讀寫Excel表格的速度,原小於python程序自身的運行速度。
(四)
前言
當年看《別怕,Excel VBA其實很簡單》相見恨晚,看了第一版電子版之后,買了紙質版,然后將其送人。而后,發現出了第二版,買之收藏。之后,發現Python這一編程語言,簡直是逆天,業余非程序員的福音。人生苦短,我用python。簡短幾句代碼,實現好多自己不敢想的功能。
自學VBA發現對VBA和python,我有着這樣幾個看法:(只是針對自動化辦公)
- 非專業表哥,只是普通辦公,希望偶爾遇到點重復的工作可以自動化一下。VBA對於我來說,要記得東西還是太多了,語法上不簡潔。每寫一個功能,代碼太長了。
- VBA雖然在很多程序都有接口,但是,應用范圍還是略窄,對於一般用戶深入學習后,但是,應用場景太少。有任務驅動,才有動力去提高水平。
- Python運行速度絕對不算快的,但是,絕對比在Excel中運行VBA的速度還是要快很多
- Python語言簡潔(python大法好),模塊豐富,有好多大神造好的輪子等着我們去用。
- Python應用范圍廣,既能幫我解決偶爾遇到的表格問題,也能和其他各種軟件或者平台聯接起來。
運用Python自定義宏(僅限Windows)
- 准備工作
- 安裝xlwings模塊
- 下載模版文件,百度網盤鏈接:xlwings自定義宏和函數模版
文件列表
其中,自定義模版可以修改名稱,mymacro為自定義宏的python文件,myfun為自定義函數的python文件。 -
設置Excel信任中心,信任對VBA工程對象模型的訪問
信任中心設置
- 自定義宏
用記事本打開mymacro0,輸入下列語句:
-
import xlwings as xw
-
-
def my_macro():
-
wb = xw.Book.caller()
-
wb.sheets[ 0].range('A1').value = wb.name
則宏名稱為my_macro的宏就編寫好了,將工作簿的名稱輸入到A1單元格。自定義宏只需要前兩句不變,后面內容自己編寫,即自定義宏需要以下面的語句為開頭
-
import xlwings as xw
-
運行方式:先alt+F8運行ImportPythonUDFs內置宏,導入我們的自定義宏和函數,導入后,再運行我定義的my_macro宏。
執行
- 自定義函數
准備工作是一致的,打開myfun0,寫入第一個自定義函數:
-
import xlwings as xw
-
-
def myfun():
-
wb = xw.Book.caller()
-
return wb.name
注意,開頭語句為@xw.func而不是@xw.sub了,然后函數相對於宏,有返回值,所以用了return語句。自定義好函數之后,剛可以像Excel自帶函數一樣的去使用了。如在A1單元格輸入”=myfun()",則會得到工作簿的名稱。
結束
本文給出了xlwings模塊自定義宏和函數的模版,然后簡單介紹了如何去定義宏和函數。注意:
- 一個python文件,只能定義一個宏或者函數,所以模版中已經默認分別給出了三個宏和函數文件,方便直接使用。
- python文件的名稱和相對文件位置不能改變,Excel文件的文件位置不能改變,名稱可以改變。如需修改,請參考xlwings官方文檔。
作者:LuckyFrog
鏈接:https://www.jianshu.com/p/e21894fc5501
來源:簡書
著作權歸作者所有。