Python操作Excel的Xlwings教程(三)

在上篇文章《操作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頁的詳情如下截圖:

image

所以我們總結(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ù)如下:

image

先導(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知識褐澎,相必你也躍躍欲試了会钝,趕快操作起來吧!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末工三,一起剝皮案震驚了整個(gè)濱河市顽素,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌徒蟆,老刑警劉巖胁出,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異段审,居然都是意外死亡全蝶,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門寺枉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來抑淫,“玉大人,你說我怎么就攤上這事姥闪∈嘉” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵筐喳,是天一觀的道長催式。 經(jīng)常有香客問我,道長避归,這世上最難降的妖魔是什么荣月? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮梳毙,結(jié)果婚禮上哺窄,老公的妹妹穿的比我還像新娘。我一直安慰自己账锹,他們只是感情好萌业,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著奸柬,像睡著了一般生年。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鸟缕,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天晶框,我揣著相機(jī)與錄音,去河邊找鬼懂从。 笑死授段,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的番甩。 我是一名探鬼主播侵贵,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼缘薛!你這毒婦竟也來了窍育?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤宴胧,失蹤者是張志新(化名)和其女友劉穎漱抓,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體恕齐,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡乞娄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了显歧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片仪或。...
    茶點(diǎn)故事閱讀 39,965評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖士骤,靈堂內(nèi)的尸體忽然破棺而出范删,到底是詐尸還是另有隱情,我是刑警寧澤拷肌,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布到旦,位于F島的核電站,受9級特大地震影響巨缘,放射性物質(zhì)發(fā)生泄漏厢绝。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一带猴、第九天 我趴在偏房一處隱蔽的房頂上張望昔汉。 院中可真熱鬧,春花似錦拴清、人聲如沸靶病。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽娄周。三九已至,卻和暖如春沪停,著一層夾襖步出監(jiān)牢的瞬間煤辨,已是汗流浹背裳涛。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留众辨,地道東北人端三。 一個(gè)月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像鹃彻,于是被迫代替她去往敵國和親郊闯。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評論 2 355