在上篇文章《操作Excel的Xlwings教程(二)》中重點(diǎn)介紹了Xlwings中的App狞换,Book等API知識點(diǎn)。本次推文將繼續(xù)上次的知識點(diǎn)裕坊,將繼續(xù)介紹Xlwings中Sheet和Range等API相關(guān)的知識包竹,并展示一些小例子,讓大家可以跟著教程進(jìn)行學(xué)習(xí)。
順便說一下周瞎,本人使用的Xlwings的版本號為:0.19.1
Xlwings中的Sheet對應(yīng)的是Excel文件中的Sheet頁悟狱,Range對應(yīng)的是Excel文件的單元格,在Xlwings中Range在有些時(shí)候也表示一個(gè)選定的區(qū)域堰氓。當(dāng)然在選定Range之前挤渐,我們是需要進(jìn)行Sheet頁的引用的。
一双絮、 Sheets
跟Apps和App的關(guān)系一樣浴麻,所有的Sheet構(gòu)成Sheets集合。假設(shè)現(xiàn)在我們有一個(gè)Excel文件1.xlsx囤攀,它有兩個(gè)Sheet頁Shee1和Shee2,我們嘗試進(jìn)行以下的操作:
import xlwings as xwwb = xw.Book('1.xlsx') #以xw.Book()方式打開工作簿print(wb.sheets) #查看當(dāng)前工作簿的所有Sheet詳情print(wb.sheets.active) #激活一個(gè)Sheet發(fā)現(xiàn)是Sheet2# 在Sheet1前新增一個(gè)Sheet并命名print(wb.sheets.add(name='Python知識學(xué)堂', before='Sheet1'))# print(wb.sheets.add(name='Python知識學(xué)堂', 1)) print(wb.sheets.active) #激活Sheet頁软免,這個(gè)Sheet是新增的
以上代碼中的輸出如下:
Sheets([<Sheet [1.xlsx]Sheet1>, <Sheet[1.xlsx]Sheet2>])
<Sheet [1.xlsx]Sheet2>
<Sheet [1.xlsx]Python知識學(xué)堂>
<Sheet [1.xlsx]Python知識學(xué)堂>
且打開的1.xlsx文件的Sheet頁的詳情如下截圖:
所以我們總結(jié)出其中的兩個(gè)操作:
# 返回激活(活動(dòng))工作表wb.sheets.active# 新增Sheet頁,參數(shù)默認(rèn)均為None焚挠,其中name為名稱膏萧,before指在那個(gè)頁簽前插入,after為哪個(gè)頁簽之后插入蝌衔。wb.sheets.add(name= None,before = None,after = None)
二榛泛、 Sheet
之前提及到所有的Sheet構(gòu)成Sheets集合,這一小節(jié)我們將介紹屬于Sheet(或)Sheets的一些常用方法或?qū)傩裕ú僮鳎?/p>
假設(shè)現(xiàn)在我們有一個(gè)Excel文件2.xlsx噩斟,它有兩個(gè)Sheet頁Shee1和Shee2,我們嘗試進(jìn)行以下的操作:
import xlwings as xwwb = xw.Book('2.xlsx')wb.sheets[0]) # 使用索引值引用"2.xlsx"文件的Sheet1wb.sheets['Sheet1'] # 直接使用名稱引用"2.xlsx"文件的Sheet1wb.sheets.add() # 新建一個(gè)Sheet曹锨。默認(rèn)為Sheet3wb.sheets.count # 獲得工作簿中工作表sheet的數(shù)量
方法或?qū)傩裕?/strong>
sheet = wb.sheets['Sheet1'] # 引用工作表Sheet1sheet.active #獲取當(dāng)前活躍的工作簿sheet.autofit() #在整個(gè)工作表上自動(dòng)調(diào)整寬度,可傳參數(shù)sheet.autofit(axis='c') # 在整個(gè)工作表上自動(dòng)調(diào)整列的寬度sheet.autofit(axis='r') # 在整個(gè)工作表上自動(dòng)調(diào)整行的寬度sheet.book # 返回指定Sheet的book,輸出 <Book [2.xlsx]>sheet.cells # 返回一個(gè)Range對象,該對象表示Sheet上的所有單元格(而不僅僅是當(dāng)前正在使用的單元格)輸出<Range [2.xlsx]Sheet1!$1:$1048576>sheet.name # 獲取工作表的名稱sheet.name = '我愛python知識學(xué)堂'# 工作表重命名sheet.clear() # 清空工作表中的內(nèi)容和格式sheet.index # 返回對應(yīng)sheet的索引值剃允,從0計(jì)數(shù)sheet.delete() # 刪除工作表sheet.clear_contents() # 清除工作表的內(nèi)容沛简,但保留格式# 工作表sheet中有數(shù)據(jù)區(qū)域最大的行數(shù),法1sheet['a1048576'].end('up').row # 工作表sheet中有數(shù)據(jù)區(qū)域最大的行數(shù)斥废,法2sheet.used_range.last_cell.row# 工作表sheet中有數(shù)據(jù)區(qū)域最大的列數(shù)椒楣,法1sheet['xfd1'].end('left').column# 工作表sheet中有數(shù)據(jù)區(qū)域最大的列數(shù),法2 sheet.used_range.last_cell.column # 返回工作表中已經(jīng)使用的單元格區(qū)域 sheet.api.UsedRange 或sheet.used_range sheet.api.row('2:4').insert # 插入行牡肉,在第2-4行插入空白行sheet.api.row('2:4').delete # 刪除行# 取值sheet.cells(行號,列號).value
三捧灰、Range
在Excel中我們做的最多的就是對Excel單元格的操作,在Xlwings中涉及到的Range的方法也是比較多的荚板。這一章我們將使用小例子的方式探究Xlwings中涉及到的有關(guān)Range的方法或?qū)傩浴?/p>
假設(shè)我們有一個(gè)名為“3.xlsx”的文件凤壁,其數(shù)據(jù)如下:
先導(dǎo)入模塊吩屹,并打開工作簿跪另,引用sheet1工作表:
import xlwings as xwapp = xw.App(visible=True,add_book=False)wb = app.books.open('3.xlsx')sheet = wb.sheets['Sheet1'] # 或wb.sheets[0]wb.close()app.quit()app.kill()
正如之前講述的,上述代碼是創(chuàng)建應(yīng)用打開Excel的煤搜,這種方式打開之后需要進(jìn)行關(guān)閉免绿。
以下我們使用Xlwings中的Book
import xlwings as xwwb = xw.Book('3.xlsx')# sheet = wb.sheets[0]# 這里我們直接引用“當(dāng)前活動(dòng)工作表的單元格”Range = xw.Range('A1')
方法或?qū)傩裕?/strong>
xw.Range('A1') # 引用A1單元格xw.Range('A1').value # 取A1單元格的值,輸出1.0xw.Range('A1').value = 12 # 設(shè)置值xw.Range('A1').raw_value # 直接獲取并設(shè)置所使用(pywin32)引擎發(fā)送/接受的值,而無需進(jìn)行任何xlwings數(shù)據(jù)清理/轉(zhuǎn)換擦盾。xw.Range ('A1:B2').value # 引用區(qū)域并取值嘲驾,輸出[[1.0, 9.0],[2.0, 10.0]]淌哟,以二元list形式# 與上述等效xw.Range ((1,1), (2,2)).value # 與上述等效xw.Range (('A1'), ('B2')).value # 添加超鏈接xw.Range ('A9').add_hyperlink(address='www.baidu.com') xw.Range ('A10').address # 返回表示范圍參考的字符串值,輸出 $A$10xw.Range ('A1').api # 返回所使用引擎的本機(jī)對象xw.Range ('A1').autofit() # 自動(dòng)調(diào)整范圍內(nèi)所有單元格的寬度和高度辽故。# 如果僅自動(dòng)調(diào)整列的寬度徒仓,使用sheet.range('A1:B2').columns.autofit()# 如果僅自動(dòng)調(diào)整行的高度,使用 sheet.range('A1:B2').rows.autofit()xw.Range ('A1').clear() # 清除所選擇單元格的內(nèi)容和格式誊垢,可選擇范圍# 清除范圍的內(nèi)容掉弛,但保留格式。xw.Range ('A1').clear_contents() xw.Range ('A1').color #獲取A1單元格的背景色喂走。#設(shè)置A1單元格的背景色殃饿,RGB顏色xw.Range ('A1').color = (255,255,255) xw.Range ('A1').color = None #刪除背景色xw.Range ('B1:C4').column # 返回所選范圍第一列的列標(biāo),此處輸出2xw.Range ('B2:C4').row # 返回所選范圍第一行的行標(biāo)芋肠,此處輸出2xw.Range ('A1:B2').count # 返回所選范圍單元格數(shù)量乎芳,此處輸出4# 此屬性返回一個(gè)Range對象,該對象表示由(但不包括)空白行和空白列或工作表的邊緣的任意組合限制的范圍帖池,好比是一片連接的區(qū)域xw.Range ('A1').current_region xw.Range ('A1').delete() # 刪除單元格A1,有參數(shù)left和up奈惑,如delete('up')。如果省略睡汹,Excel將根據(jù)范圍的形狀進(jìn)行決定携取。xw.Range ('A1').end('down') # 返回一個(gè)Range對象,該對象表示包含源范圍的區(qū)域末尾的單元格帮孔。此處輸出<Range [3.xlsx]Sheet1!$A$8>雷滋,參數(shù)可傳down,up,left,right,其實(shí)也是返回ctrl + 方向# 設(shè)置A9單元格公式計(jì)算的值xw.Range ('A9').formula='=SUM(B1:B5)'# 輸出公式值文兢,輸出'=SUM(B1:B5)'print(xw.Range ('A9').formula) # 以指定的格式返回范圍的地址xw.Range ('A1:B2').get_address() #參數(shù):#row_absolute(bool ,默認(rèn)為True)–設(shè)置為True可以將引用的行部分作為絕對引用返回晤斩。#column_absolute(bool,默認(rèn)為True)–設(shè)置為True可以將引用的列部分作為絕對引用返回。#include_sheetname(bool ,默認(rèn)為False)–設(shè)置為True可以在地址中包含工作表名稱姆坚。#external(bool ,默認(rèn)為False)–設(shè)置為True以返回帶有工作簿和工作表名稱的外部引用澳泵。#具體的情況大家可以傳入幾個(gè)參數(shù)試試xw.Range ('A1:B2').height # 返回單元格(范圍)的高度xw.Range ('A1:B2').width # 返回范圍的寬度# 獲取范圍的高度(以磅為單位)xw.Range ('B2:C4').row_height # 設(shè)置范圍的高度(以磅為單位)xw.Range ('B2:C4').row_height = 15
那么Xlwings是如何獲取一個(gè)Range的行列數(shù)呢,以及其他的一些操作呢兼呵,我們來看以下的代碼:
# 獲取范圍行和范圍列xw.Range ('B2:C4').rows # 返回一個(gè)RangeRows對象兔辅,該對象表示指定范圍內(nèi)的行。xw.Range ('B2:C4').columns # 返回一個(gè)RangeRows對象击喂,該對象表示指定范圍內(nèi)的列维苔。xw.Range('B2:C4').rows.count # 獲取范圍行# 獲取范圍列xw.Range('B2:C4').columns.count xw.Range ('B2').left # 返回從A列的左邊緣到范圍左邊緣的距離xw.Range ('B2').top # 返回從第1行的頂部邊緣到范圍的頂部邊緣的距離xw.Range ('A1').hyperlink # 返回單元格中的超鏈接(對多個(gè)單元格沒效)# 插入單元格xw.Range ('A3').insert(shift='right') #返回指定范圍的右下角單元格range = xw.Range ('A1:C4').last_cell range.last_cell.row # 4range.last_cell.column # 3xw.Range("A4:C4").api.merge() # 合并單元格通過pywin32的api調(diào)用mergexw.Range("A4:C4").api.unmerge()# 拆分單元格xw.Range('A1').number_format # 獲取設(shè)置Range的number_format# 設(shè)置Range的number_formatxw.Range('A1:C3').number_format = '0.00%' xw.Range('A1:A3').paste() # 將剪貼板中的范圍粘貼到指定范圍# 調(diào)整指定范圍的大小xw.Range('A1:A3').resize(row_size = None,column_size = None ) # 選定單元格進(jìn)行移動(dòng)xw.Range('B2:C4').offset(row_offset=0,column_offset=0) #row_offset行偏移,column_offset列偏移xw.Range('B2:C4').shape # 以數(shù)組的形式返回所選范圍的值xw.Range('B2:C4').sheet # 返回Range所屬的Sheet對象xw.Range('B2:C4').size # 返回所選范圍單元格個(gè)數(shù)(元素個(gè)數(shù))
這里想到一個(gè)參數(shù):在讀值的時(shí)候如果想將行或列方向信息需要保留下來懂昂,需要設(shè)置options的參數(shù)值介时。
請分析這兩行代碼的輸出:
xw.Range('B2:C4').options(ndim=2).valuexw.Range('A1:C1').options(ndim=2).value
四、小結(jié)
大家可以看出,這些API的知識還是很豐富的沸柔,這也是Xlwings強(qiáng)大的地方循衰,當(dāng)然了這些小操作結(jié)合起來就會(huì)有意想不到的效果。介紹了這么多的API知識褐澎,相必你也躍躍欲試了会钝,趕快操作起來吧!