在日常的工作中,我們或多或少的都要和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方法
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ù)可選历帚,具體如下:
官網(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使用差異
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ù)如下:
# 傳遞字符串或索引/切片使得取值更加方便
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ù)文件如下:
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ù)堵幽?
當(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)各位閱讀的小伙伴指出团滥,十分感謝竿屹!