Python操作Excel的Xlwings教程(一)

在日常的工作中,我們或多或少的都要和Excel打交道。甚至在一些領(lǐng)域悠汽,某一些業(yè)務(wù)人員的主要工作就是處理Excel表格潜圃,處理大量的Excel數(shù)據(jù)并生成一系列的報(bào)表缸棵。對(duì)于程序員朋友們來(lái)說(shuō),更喜歡以代碼的形式來(lái)處理Excel谭期,從而實(shí)現(xiàn)一些Excel中的一些函數(shù)功能堵第。那么在Python中處理Excel的模塊(或者說(shuō)叫第三方庫(kù))有哪些呢吧凉,主要如下:

Xlrd:xlrd支持.xls、.xlsx Excel文件的讀踏志,并不支持.xls阀捅、.xlsx 文件的寫(xiě)。

Xlwt:xlwt僅支持.xls文件的寫(xiě)针余。

Xlsxwriter:xlswriter支持.xlsx文件的寫(xiě)饲鄙,另外此模塊還支持VBA操作。

Win32com:win32com支持Excel的.xlsx和.xls圆雁,安裝pypiwin32即可使用該庫(kù)忍级,該模塊現(xiàn)在只支持Windows系統(tǒng)。

Openpyxl:openpyxl支持Excel2010多種文件的操作摸柄,read_only和write_only兩個(gè)參數(shù)值得注意颤练,該模塊對(duì)VBA的支持不好,不支持 .xls文件的操作驱负。

Xlwings:xlwings實(shí)現(xiàn)了Excel中調(diào)用Python嗦玖,python中調(diào)用Excel的騷操作,支持.xls文件的讀跃脊,支持.xlsx文件的讀寫(xiě)宇挫,支持VBA的操作,另外還支持和Numpy酪术、Pandas結(jié)合進(jìn)行操作器瘪,在很大程度上擴(kuò)展了應(yīng)用。

Pandas :pandas不用多說(shuō)了绘雁,數(shù)據(jù)分析領(lǐng)域最為重要的庫(kù)橡疼,支持.xls和.xlsx讀寫(xiě)。

接下來(lái)就將對(duì)Xlwings的相關(guān)知識(shí)進(jìn)行介紹了:

一. 安裝(教程使用: windows下python3.6.5)

pipinstall xlwings         

二. 導(dǎo)入

importxlwings as xw       

注: xlwings的更新和卸載和python其他的庫(kù)的操作一致庐舟,不在贅述

三. 實(shí)踐操作

3.1. 創(chuàng)建新的Excel文件

# 方法1:
# 創(chuàng)建一個(gè)新的App欣除,并在新App中新建一個(gè)Book
wb = xw.Book()
wb.save('1.xlsx')
wb.close()
# 方法2:
# 當(dāng)前App下新建一個(gè)Book
# visible參數(shù)控制創(chuàng)建文件時(shí)可見(jiàn)的屬性
app=xw.App(visible=False,add_book=False)
wb=app.books.add()
wb.save('1.xlsx')
wb.close()
app.quit() #結(jié)束進(jìn)程   

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

image

3.2. 打開(kāi)已有的Excel文件

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

xw.Book()打開(kāi)文件傳入的參數(shù)可選历帚,具體如下:

image

官網(wǎng)中有一句提醒:

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']

也是就是說(shuō):

(1)每個(gè)App對(duì)應(yīng)一個(gè)PID值,這個(gè)PID值可以認(rèn)為是一個(gè)標(biāo)簽杠娱,用來(lái)識(shí)別不同的App挽牢。

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

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

(3)通過(guò)xlwings可以創(chuàng)建多個(gè)App,每個(gè)App又可以創(chuàng)建多個(gè)工作簿摊求,每一個(gè)工作簿中又可 以創(chuàng)建多個(gè)Sheet禽拔。

(4)需要注意的是這些App之間是相互獨(dú)立的,也就是操作不同的工作簿的時(shí)候就要找到對(duì) 應(yīng)的App。

建議使用:xw.Book('filename.xlsx') 來(lái)打開(kāi)工作薄或引用工作簿奏赘,不容易出錯(cuò)

xw.Book 和 xw.books使用差異

image

3.3. 讀入和寫(xiě)入值

# 在A1單元格寫(xiě)入值
# 實(shí)例化一個(gè)工作表對(duì)象
sheet1 = wb.sheets["sheet1"]
# 或者
# sheet1 =xw.books['1.xlsx'].sheets['sheet1']
# print(sheet1.name) 輸出工作簿名稱(chēng)
# 寫(xiě)入值
sheet1.range('A1').value = 'python知識(shí)學(xué)堂'
# 讀值并打印
print('value of A1:',sheet1.range('A1').value)
# 清空單元格內(nèi)容,如果A1中是圖片寥闪,此方法沒(méi)有效果
sheet1.range('A1').clear()
# 傳入列表寫(xiě)入多行值
sheet1.range('A1').value = [['a','b','c],[1,2,3]]
# 當(dāng)然也可以將pandas的DataFrame數(shù)據(jù)寫(xiě)入
?
import pandas as pddf = pd.DataFrame([[1,2], [3,4]], columns=['A', 'B'])
sheet1.range('A1').value = df
# 讀取數(shù)據(jù),輸出類(lèi)型為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: 對(duì)于A-Z的單元格可以這樣進(jìn)行訪(fǎng)問(wèn)磨淌,在進(jìn)行循環(huán)讀寫(xiě)的時(shí)候比較好用

3.4. 活動(dòng)對(duì)象

#  但存在活動(dòng)工作表的時(shí)候(比如打開(kāi)一個(gè)1.xlsx文件以后),可以直接操作
#  不存在的時(shí)候凿渊,就需要通過(guò)Book經(jīng)sheet獲取range
import xlwings as xw
xw.Range('A1').value = 'Python知識(shí)學(xué)堂'

Tips: xlwings中的對(duì)象層次結(jié)構(gòu)為:

apps->books->sheets->range

3.4. 范圍和切片取值梁只,范圍寫(xiě)值

假設(shè)現(xiàn)有的1.xlsx文件的數(shù)據(jù)如下:

image
# 傳遞字符串或索引/切片使得取值更加方便
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>
?
# 寫(xiě)值的情況
# 使用列表將1,2,3,4寫(xiě)入A1,A2,A3,A4
# transpose=True進(jìn)行轉(zhuǎn)置寫(xiě)入
wb.sheets[0].range('A1').options(transpose=True).value=[1,2,3,4]
# 將二維數(shù)組,儲(chǔ)存在A1:B3中
wb.sheets[0].range('A1').options(expand='table')=[[1,2],[3,4],[5,6]]

3.5. 一些屬性或方法

在Excel的讀寫(xiě)中埃脏,經(jīng)常需要獲取當(dāng)前打開(kāi)的文件的數(shù)據(jù)行和列數(shù)搪锣,在Xlwings中的獲取方式:

假設(shè)數(shù)據(jù)文件如下:

image
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)數(shù)據(jù)文件如下构舟,那么上述代碼的輸出是怎樣的呢?即返回結(jié)果是有數(shù)據(jù)矩陣的行數(shù)堵幽?

image
image

當(dāng)然我們可以使用遍歷的方式去尋找Excel文件中非空行的數(shù)量

可以多選幾列進(jìn)行一起判斷row =initialwhile(ws.range('A'+str(row)).value!=Nonerownum +=1

UsedRange屬性返回工作表中所有已使用范圍的單元格區(qū)域是指:?jiǎn)卧裰杏袛?shù)值狗超、公式、單元格格式化設(shè)置(例如:?jiǎn)卧褡煮w設(shè)置朴下、邊框設(shè)置等等)

大家可以對(duì)比Openpyxl和其他的庫(kù)努咐,看看計(jì)算Excel文件數(shù)據(jù)行數(shù)和列數(shù)的差異,歡迎評(píng)論留言殴胧!

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


# 獲取"AB2"單元格的行標(biāo)和列標(biāo)

print(ws.range('AB2').row)

print(ws.range('AB2').column)

# 高度和寬度

print(ws.range('AB2').row_height)

print(ws.range('AB2').column_width)

# 設(shè)置顏色,可根據(jù)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)'

# 另外還可以獲取某一個(gè)單元格的公式

print(ws.range('AB2').formula_array)

# 清除工作表的所有內(nèi)容但是保留原有格式

ws.clear_contents()

# 當(dāng)然了還有很多其他的屬性

#range.address        range.current_region    range.end

#range.api            range.autofit          range.expand         

四. 小結(jié)
好了渗稍,第一篇就寫(xiě)這么多,如果文中有錯(cuò)誤的地方還請(qǐng)各位閱讀的小伙伴指出团滥,十分感謝竿屹!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市灸姊,隨后出現(xiàn)的幾起案子拱燃,更是在濱河造成了極大的恐慌,老刑警劉巖厨钻,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扼雏,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡夯膀,警方通過(guò)查閱死者的電腦和手機(jī)诗充,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)诱建,“玉大人蝴蜓,你說(shuō)我怎么就攤上這事。” “怎么了茎匠?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵格仲,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我诵冒,道長(zhǎng)凯肋,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任汽馋,我火速辦了婚禮侮东,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘豹芯。我一直安慰自己悄雅,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布铁蹈。 她就那樣靜靜地躺著宽闲,像睡著了一般。 火紅的嫁衣襯著肌膚如雪握牧。 梳的紋絲不亂的頭發(fā)上容诬,一...
    開(kāi)封第一講書(shū)人閱讀 49,079評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音我碟,去河邊找鬼放案。 笑死,一個(gè)胖子當(dāng)著我的面吹牛矫俺,可吹牛的內(nèi)容都是我干的吱殉。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼厘托,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼友雳!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎叶堆,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體流礁,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年罗丰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了神帅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡萌抵,死狀恐怖找御,靈堂內(nèi)的尸體忽然破棺而出元镀,到底是詐尸還是另有隱情,我是刑警寧澤霎桅,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布栖疑,位于F島的核電站,受9級(jí)特大地震影響滔驶,放射性物質(zhì)發(fā)生泄漏遇革。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一瓜浸、第九天 我趴在偏房一處隱蔽的房頂上張望澳淑。 院中可真熱鬧,春花似錦插佛、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至蚌铜,卻和暖如春锨侯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背冬殃。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工囚痴, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人审葬。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓深滚,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親涣觉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子痴荐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345