處理Excel 的模塊 xlwings


轉載好文章:

Python操作Excel的Xlwings教程(一)

Python操作Excel的Xlwings教程(二)

Python操作Excel的Xlwings教程(三)

Python操作Excel的Xlwings教程(四)

Python操作Excel的Xlwings教程(五)

Python操作Excel的Xlwings教程(六)

Python操作Excel的Xlwings教程(七)

Python操作Excel的Xlwings教程(八)——Excel使用VBA調用Python

可以處理Excel文件的python模塊很多,各模塊功能對比如下

功能 XlsxWriter xlrd xlwt xlutils openpyxl xlwings Pandas
× ×  
×  
修改 × × ×  
支持xls格式 × ×
支持xlsx格式 ×
支持批量操作 × × × × ×  
支持VBA × × × ×  

  

 可以發現 xlwings功能是最齊全的。而且他可以與EXCEL VBA結合使用,實現強大的數據輸入和分析功能。

這個模塊會經常和os,pandas,Numpy,Matplotlib等模塊結合使用,讓我們可以輕松應對數據處理和分析工作。

1.創建新工作簿

2.打開已有工作簿

3.讀取和寫入值

4.其他

 

  • App相當於Excel程序(前文的進程截圖);
  • ​Book相當於Excel的工作簿;
  • Range相當於單元格,也可以是單元格區域;
  • 多個Excel程序則由Apps表示,單個為App;
  • 多個工作簿用Books表示,單個為Book;
  • 多個工作表用Sheets表示,單個為Sheet。

1.創建工作簿

# 方法1:
# 創建一個新的App,並在新App中新建一個Book
wb = xw.Book()
wb.save('1.xlsx')
wb.close()
​
# 方法2:
# 當前App下新建一個Book
# visible參數控制創建文件時可見的屬性
app=xw.App(visible=False,add_book=False)
wb=app.books.add()
wb.save('1.xlsx')
wb.close()
app.quit() #結束進程

下圖展示了xlwings.mian.app的 __init__方法

 
        

2.打開已有的Excel文件

import xlwings as xw
app=xw.App(visible=True,add_book=False) app.display_alerts=False #不顯示Excel消息框 app.screen_updating=False #關閉屏幕更新,可加快宏的執行速度 wb=app.books.open('1.xlsx') # print(wb.fullname) # 輸出打開的excle的絕對路徑 wb.save() wb.close() app.quit() # 退出excel程序, # app.kill() 通過殺掉進程強制Excel app退出 ​
# 以第一種方式創建Book時,打開文件的操作可如下

import xlwings as xw
app=xw.App(visible=True,add_book=False)
app.display_alerts=False   #不顯示Excel消息框
app.screen_updating=False  #關閉屏幕更新,可加快宏的執行速度
wb = xw.Book('1.xlsx')
print(wb.fullname) # 輸出打開的excle的絕對路徑
wb.save()
wb.close()
app.quit() # 退出excel程序
# app.kill() 通過殺掉進程強制Excel app退出

xw.Book()打開文件傳入的參數可選,具體如下:

 

官網中有一句提醒:

If you have the same file open in two instances of Excel, you need to fully qualify it and include the app instance. You will find your app instance key (the PID) via xw.apps.keys():
xw.apps[10559].books['FileName.xlsx']

也是就是說:

(1)每個App對應一個PID值,這個PID值可以認為是一個標簽,用來識別不同的App。

(2)創建工作簿之前要先創建App:

app=xw.App(visible=Ture,add_book=False)

(3)通過xlwings可以創建多個App,每個App又可以創建多個工作簿,每一個工作簿中又可 以創建多個Sheet。

(4)需要注意的是這些App之間是相互獨立的,也就是操作不同的工作簿的時候就要找到對 應的App。

建議使用:xw.Book('filename.xlsx') 來打開工作薄或引用工作簿,不容易出錯

官網中有一句提醒:

If you have the same file open in two instances of Excel, you need to fully qualify it and include the app instance. You will find your app instance key (the PID) via xw.apps.keys():
xw.apps[10559].books['FileName.xlsx']

也是就是說:

(1)每個App對應一個PID值,這個PID值可以認為是一個標簽,用來識別不同的App。

(2)創建工作簿之前要先創建App:

app=xw.App(visible=Ture,add_book=False)

(3)通過xlwings可以創建多個App,每個App又可以創建多個工作簿,每一個工作簿中又可 以創建多個Sheet。

(4)需要注意的是這些App之間是相互獨立的,也就是操作不同的工作簿的時候就要找到對 應的App。

建議使用:xw.Book('filename.xlsx') 來打開工作薄或引用工作簿,不容易出錯

官網中有一句提醒:

If you have the same file open in two instances of Excel, you need to fully qualify it and include the app instance. You will find your app instance key (the PID) via xw.apps.keys():
xw.apps[10559].books['FileName.xlsx']

也是就是說:

(1)每個App對應一個PID值,這個PID值可以認為是一個標簽,用來識別不同的App。

(2)創建工作簿之前要先創建App:

app=xw.App(visible=Ture,add_book=False)

(3)通過xlwings可以創建多個App,每個App又可以創建多個工作簿,每一個工作簿中又可 以創建多個Sheet。

(4)需要注意的是這些App之間是相互獨立的,也就是操作不同的工作簿的時候就要找到對 應的App。

建議使用:xw.Book('filename.xlsx') 來打開工作薄或引用工作簿,不容易出錯。 xw.Book 和 xw.books使用差異

3.讀取和寫入值

# 在A1單元格寫入值
# 實例化一個工作表對象
sheet1 = wb.sheets["sheet1"]
# 或者
# sheet1 =xw.books['1.xlsx'].sheets['sheet1']
# print(sheet1.name) 輸出工作簿名稱
# 寫入值
sheet1.range('A1').value = 'python知識學堂'
# 讀值並打印
print('value of A1:',sheet1.range('A1').value)
# 清空單元格內容,如果A1中是圖片,此方法沒有效果
sheet1.range('A1').clear()
# 傳入列表寫入多行值
sheet1.range('A1').value = [['a','b','c],[1,2,3]]
# 當然也可以將pandas的DataFrame數據寫入
import pandas as pd
df = pd.DataFrame([[1,2], [3,4]], columns=['A', 'B']) sheet1.range('A1').value = df # 讀取數據,輸出類型為DataFrame sheet1.range('A1').options(pd.DataFrame, expand='table').value # 支持添加圖片的操作 import matplotlib.pyplot as plt fig = plt.figure() plt.plot(x, np.log(x)) sheet1.pictures.add(fig, name='MyPlot', update=True)
n =65
n = chr(n)   # ASCII字符
pos = '%s%d' % (n, 1)
print(pos)  #A1

Tips: 對於A-Z的單元格可以這樣進行訪問,在進行循環讀寫的時候比較好用

4.其他

4.1 活動對象

#  存在活動工作表的時候(比如打開一個1.xlsx文件以后),可以直接操作
#  不存在的時候,就需要通過Book經sheet獲取range
import xlwings as xw
xw.Range('A1').value = 'Python知識學堂'

Tips: xlwings中的對象層次結構為:

apps->books->sheets->range

4.2 range 

假設現有的1.xlsx文件的數據如下:

# 傳遞字符串或索引/切片使得取值更加方便
app = xw.App(visible=False,add_book=False)
wb = app.books.open('1.xlsx')
range_1 = wb.sheets[0].range('A1:D3')
print(range_1)
# <Range [1.xlsx]Sheet1!$A$1:$D$3>
print(range_1.value)
# [[None, 'a', 'b', None], [0.0, 1.0, 2.0, None], [1.0, 3.0, 4.0, None]]
# 切片方式
range_2 = wb.sheets[0][:3, :3]
# <Range [1.xlsx]Sheet1!$A$1:$C$3>
# 寫值的情況
# 使用列表將1,2,3,4寫入A1,A2,A3,A4
# transpose=True進行轉置寫入
wb.sheets[0].range('A1').options(transpose=True).value=[1,2,3,4]
# 將二維數組,儲存在A1:B3中
wb.sheets[0].range('A1').options(expand='table')=[[1,2],[3,4],[5,6]]

在Excel的讀寫中,經常需要獲取當前打開的文件的數據行和列數,在Xlwings中的獲取方式:

假設數據文件如下:

ws = wb.sheets['Sheet1']
shape = ws.used_range.shape
print(shape) #(2, 3)
​
nrow1 = ws.api.UsedRange.Rows.count
ncol1 = ws.api.UsedRange.Columns.count
print(nrow1) # 2
print(ncol1) # 3
​
rng = ws.range('A1').expand()
nrow2 = rng.last_cell.row
ncol2 = rng.last_cell.column
print(nrow2)  # 3
print(ncol2)  # 1

(I) 如果整張表為空,上述代碼輸出是怎樣的呢?

(II)數據文件如下,那么上述代碼的輸出是怎樣的呢?即返回結果是有數據矩陣的行數?

當然我們可以使用遍歷的方式去尋找Excel文件中非空行的數量

# 可以多選幾列進行一起判斷
row = initial
while (ws.range('A'+str(row)).value !=None
    rownum += 1

UsedRange屬性返回工作表中所有已使用范圍的單元格區域是指:單元格中有數值、公式、單元格格式化設置(例如:單元格字體設置、邊框設置等等)  

可以對比Openpyxl和其他的庫,看看計算Excel文件數據行數和列數的差異.  

  

單元格還有其他一些屬性和方法:

# 獲取"AB2"單元格的行標和列標
print(ws.range('AB2').row)
print(ws.range('AB2').column)
# 高度和寬度
print(ws.range('AB2').row_height)
print(ws.range('AB2').column_width)
# 設置顏色,可根據RGB顏色表尋找自己想要的顏色
ws.range('AB2').color = (255,0,0)
# 獲取顏色
print(ws.range('AB2').color)
# 清除顏色格式
ws.range('AB2').color = None
# 使用公式
ws.range('AB2').formula='=SUM(A1,A2)'
# 另外還可以獲取某一個單元格的公式
print(ws.range('AB2').formula_array)
# 清除工作表的所有內容但是保留原有格式
ws.clear_contents()
# 當然了還有很多其他的屬性
#range.address        range.current_region    range.end
#range.api            range.autofit          range.expand

  

 

import xlwings as xw app1 = xw.App() app2 = xw.App() print(xw.apps)

第二、三行代碼建立了兩個創建工作簿實例,運行后發現:默認的打開了兩個工作簿,這兩個工作簿會顯示的存在於你的桌面。

如果不想顯示,我們在創建實例的時候可以使用參數:wx.App(visible=False)

第四行輸出為:Apps([<Excel App 9244>, <Excel App 19476>]),其中[9244]和[19476]即為這兩個實例的PID。

xw.apps.active # 返回活動的應用程序 print(xw.apps.active) # 輸出<Excel App 9244>活動應用程序的key xw.apps.count # 計算app的總數 xw.apps.add() # 新增一個app xw.apps.keys() # 返回所有Excel實例的PID

Active:很多小伙伴可能對激活不是很清楚,舉個例子:我們再使用Excel軟件的時候,可以打開好幾個工作簿,但是我們不能對打開的工作簿同時進行操作,只能操作其中一個。
這個Active的作用就是激活其中的一個你想使用的工作簿,將它變為活動工作簿。
for i in range(1,4): wookbook = xw.Book() #創建新的App並在創建的App新建Book print(wookbook) print(xw.books) #當前打開的所有Book對象的集合

 

 xw.Book()會新建工作簿,這里默認會新建一個App,即打開Excel程序,並新建一個工作簿。而且Book這種方式則會打開多個窗口,之前所說的App.books.open方式則不會。

順便提一下引用工作簿的方法:(使用工作簿前要引用工作簿)

xw.Book('工作簿1') # 通過Book xw.books['工作簿1'] # 通過books
1wb.app.calculate() # Calculates all open books. 2wb.app.calculation = manual# 設置計算模式 3wb.app.display_alerts = True # 默認值為TrueFalse的情況下執行操作的時候會忽略Excel的提示和警報消息(即彈窗信息) 4wb.app.screen_updating = False # 禁止屏幕更新(刷新) 5wb.app.range(cell1, cell2=None) # 獲取單元格 6wb.app.selection # 將所選單元格作為Range返回 7xw.App().version # 返回Excel程序版本號

首先要知道所有的Book構成Books,即Books是所有Book對象的集合,那么Books中有哪些常用的方法或屬性呢?
import xlwings as xw
app1 = xw.App()
app2 = xw.App()
print(xw.books)
book_keys = xw.apps.keys()
first_book = book_keys[0]             # 取列表的第一個值
print(xw.apps[first_book].books)      # 應用
print(app1.books.active)              # 激活一個Book
print('count1:',app1.books.count)     # 先打印一下app1下Book的總數
app1.books.add()                      # 增加一個新的Book,此新建的Book將自動變成被激活的Book
print('count1:',app1.books.count)     # 再次打印app1下Book的總數
app1.books.open('1.xlsx')             # 打開操作,如果工作簿未打開則打開,若它已經打開,則返回工作簿對象。
# 或指定絕對路徑打開文件  app1.books.open('D:\datafile\1.xlsx') 
print(app1.books.open('1.xlsx'))      
print('count1:',app1.books.count)   # 再一次打印app1下Book的總數

# 若想關閉某一個app下的全部工作簿的時候,可以使用kill(),如app1.kill()。

  

四、Book

官網中介紹到:A book object is a member of the books collection,即Book對象是Books集合的成員。下表顯示了xw.Book()和xw.books三種情況下的操作:(上篇推文也有介紹)

Tips: 差別在於xw.Book()創建新的工作薄實例,xw.books是在活動工作薄中尋找一個實例

xw.Book()打開文件的時候,可選參數較多,具體的參數可以查看其構造函數,或者查看上篇文章

方法和屬性

xw.Book.activate(steal_focus=True)   # True則激活最前面的窗口,並將焦點從python移交給excel
xw.Book.app                          # 獲取創建工作簿的app對象
xw.Book.caller()                     # 當通過RunPython從Excel調用Python函數時引用調用的工作簿
xw.Book.set_mock_caller()            # 設置當前工作薄為Python代碼的調用者即set_mock_caller讓Python知道誰是調用者
xw.Book.close()                      # 關閉工作簿而不進行保存
xw.Book.selection                    # 返回選定的單元格作為Range
xw.Book.macro()                      # 在Excel VBA中運行Sub或Function
xw.Book.name                         # 返回工作簿的名稱
xw.Book.names                        # 返回一個名稱集合
xw.Book.save(path=None)              # 保存工作簿,可傳入保存路徑,同名會直接覆蓋
xw.Book.sheets                       # 返回表示工作簿中所有工作表的工作表集

  

 


免責聲明!

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



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