(轉)xlwings使用教程


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基本對象

  1. 打開已保存的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()
  2. 新建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()
  3. 在單元格輸入值
    新建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中。

引用工作簿、工作表和單元格

  1. 引用工作簿,注意工作簿應該首先被打開
    wb.=xw.books['工作簿的名字‘]
  2. 引用活動工作簿
    wb=xw.books.active
  3. 引用工作簿中的sheet
    sht=xw.books['工作簿的名字‘].sheets['sheet的名字']
    # 或者
    wb=xw.books['工作簿的名字']
    sht=wb.sheets[sheet的名字]
  4. 引用活動sheet
    sht=xw.sheets.active
  5. 引用A1單元格
    rng=xw.books['工作簿的名字‘].sheets['sheet的名字']
    # 或者
    sht=xw.books['工作簿的名字‘].sheets['sheet的名字']
    rng=sht.range('A1')
  6. 引用活動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))

儲存數據

  1. 儲存單個值
    # 注意".value“
    sht.range('A1').value=1
  2. 儲存列表
    # 將列表[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]]

讀取數據

  1. 讀取單個值
    # 將A1的值,讀取到a變量中
    a=sht.range('A1').value
  2. 將值讀取到列表中
    #將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基本對象

常用函數和方法

  1. 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()
  2. sheet 常用的api
    # 引用某指定sheet
    sht=xw.books['工作簿名稱'].sheets['sheet的名稱']
    # 激活sheet為活動工作表
    sht.activate()
    # 清除sheet的內容和格式
    sht.clear()
    # 清除sheet的內容
    sht.contents()
    # 獲取sheet的名稱
    sht.name
    # 刪除sheet
    sht.delete
  3. 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()
  4. books 工作簿集合的api
    # 新建工作簿
    xw.books.add()
    # 引用當前活動工作簿
    xw.books.active
  5. 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一樣的圖片。

 

(三)

【劇情回顧】

  1. xlwings基本對象

     

    xlwings基本對象

     

    App相當於Excel程序,Book相當於工作簿。N個Excel程序則由apps表示,N個工作簿由books表示。

  2. 對工作簿的操作
  1.  
    #導入xlwings模塊
  2.  
    import xlwings as xw
  3.  
    #新建工作簿,這里默認為新建了一個App,即打開Excel程序,並新建一個工作簿
  4.  
    xw.Book()
  5.  
    #引用工作簿
  6.  
    xw.Book( '工作簿3')
  7.  
    # 引用工作簿也可以用books
  8.  
    xw.books[ '工作簿3’]
  9.  
    #打開已有工作簿
  10.  
    xw.Book(r 'e:\myworkbook.xlsx')
  1. 對sheet以及Range的操作
  1.  
    import xlwings as xw
  2.  
    wb=xw.Book()
  3.  
    # 引用名字為"sheet2"的sheet
  4.  
    sht=wb.sheets[ 'sheet2']
  5.  
    # 引用"sheet2"中的B1單元格
  6.  
    rng=sht.range( 'B1')
  7.  
    # 將B1單元格的值改為666
  8.  
    rng.value= 666

數據結構

  1. 一維數據
    python的列表,可以和Excel中的行列進行數據交換,python中的一維列表,在Excel中默認為一行數據
  1.  
    import xlwings as xw
  2.  
    sht=xw.sheets.active
  3.  
    # 將1,2,3分別寫入了A1,B1,C1單元格中
  4.  
    sht.range( 'A1').value=[1,2,3]
  5.  
    # 將A1,B1,C1單元格的值存入list1列表中
  6.  
    list1=sht.range( 'A1:C1').value
  7.  
    # 將1,2,3分別寫入了A1,A2,A3單元格中
  8.  
    sht.range( 'A1').options(transpose=True).value=[1,2,3]
  9.  
    # 將A1,A2,A3單元格中值存入list1列表中
  10.  
    list1=sht.range( 'A1:A3').value
  1. 二維數據
    python的二維列表,可以轉換為Excel中的行列。二維列表,即列表中的元素還是列表。在Excel中,二維列表中的列表元素,代表Excel表格中的一列。例如:
  1.  
    # 將a1,a2,a3輸入第一列,b1,b2,b3輸入第二列
  2.  
    list1=[[‘a1’, 'a2','a3'],['b1','b2','b3']]
  3.  
    sht.range( 'A1').value=list1

運行結果

  1.  
    # 將A1:B3的值賦給二維列表list1
  2.  
    list1=sht.range( 'A1:B3‘).value
  1. Excel中區域的選取表格
  1.  
    # 選取第一列
  2.  
    rng=sht. range( 'A1').expand('down')
  3.  
    rng. value=['a1','a2','a3']

 

第一列

  1.  
    # 選取第一行
  2.  
    rng=sht.range( 'A1').expand('right')
  3.  
    rng=[ 'a1','b1']

第一行

  1.  
    # 選取表格
  2.  
    rng.sht.range( 'A1').expand('table')
  3.  
    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)

  1. 准備工作
  2. 安裝xlwings模塊
  • 下載模版文件,百度網盤鏈接:xlwings自定義宏和函數模版

    文件列表


    其中,自定義模版可以修改名稱,mymacro為自定義宏的python文件,myfun為自定義函數的python文件。
  • 設置Excel信任中心,信任對VBA工程對象模型的訪問

     

    信任中心設置

  1. 自定義宏
    用記事本打開mymacro0,輸入下列語句:
  1.  
    import xlwings as xw
  2.  
    @xw.sub
  3.  
    def my_macro():
  4.  
    wb = xw.Book.caller()
  5.  
    wb.sheets[ 0].range('A1').value = wb.name

則宏名稱為my_macro的宏就編寫好了,將工作簿的名稱輸入到A1單元格。自定義宏只需要前兩句不變,后面內容自己編寫,即自定義宏需要以下面的語句為開頭

  1.  
    import xlwings as xw
  2.  
    @xw.sub

運行方式:先alt+F8運行ImportPythonUDFs內置宏,導入我們的自定義宏和函數,導入后,再運行我定義的my_macro宏。

 

執行

  1. 自定義函數
    准備工作是一致的,打開myfun0,寫入第一個自定義函數:
  1.  
    import xlwings as xw
  2.  
    @xw.func
  3.  
    def myfun():
  4.  
    wb = xw.Book.caller()
  5.  
    return wb.name

注意,開頭語句為@xw.func而不是@xw.sub了,然后函數相對於宏,有返回值,所以用了return語句。自定義好函數之后,剛可以像Excel自帶函數一樣的去使用了。如在A1單元格輸入”=myfun()",則會得到工作簿的名稱。

結束

本文給出了xlwings模塊自定義宏和函數的模版,然后簡單介紹了如何去定義宏和函數。注意:

  • 一個python文件,只能定義一個宏或者函數,所以模版中已經默認分別給出了三個宏和函數文件,方便直接使用。
  • python文件的名稱和相對文件位置不能改變,Excel文件的文件位置不能改變,名稱可以改變。如需修改,請參考xlwings官方文檔。

作者:LuckyFrog
鏈接:https://www.jianshu.com/p/e21894fc5501
來源:簡書
著作權歸作者所有。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM