本篇文章是圍繞以下四點帶大家學習xlwings。
xlwings是什么
xlwings安裝更新與卸載
xlwings詳細使用
案例分享
1.xlwings是什么
在日常生活中我們或多或少的都會跟Excel打交道,比如做銷售統計,人力的考勤,學生的考試成績等等,甚至在某些領域會涉及到批量操作Excel表格,那對于非程序員來說,可能使用Excel中的函數,但是在某種場景下這些又是不好使的,只能熬夜加班啦!但是對于程序員來說,可能就是分分鐘的事,輕松搞定。
那在我們Python中有哪些模塊(或者第三方庫)可以輕松處理Excel 呢?給大家列出來學習一下
哇slwings是不是很香,更詳細的大家可以去參看趣味干貨中的:Python殺死Excel?眾多模塊哪家強,鏈接:https://mp.weixin.qq.com/s/uL6JbxNWUYa7yjUp8aorSA
簡單介紹下xlwings,xlwings是一個可以實現從Excel調用Python,也可在python中調用Excel的庫。開源免費,一直在更新。特點:
1、xlwings支持.xls讀,支持.xlsx文件讀寫。
2、支持Excel操作。
3、支持VBA。
4、強大的轉換器可以處理大部分數據類型,包括在兩個方向上的numpy array和pandas DataFrame。
文檔鏈接:https://docs.xlwings.org/en/stable/index.html
有沒有發現,xlwings宗旨就是讓Excel飛起來!!!
2.xlwings安裝與使用
安裝
像安裝其他模塊一樣,使用pip安裝即可
pip install xlwings
如果你是在使用Anaconda也可以,使用conda安裝
conda install xlwings
請注意,官方的conda軟件包可能落后于幾個版本。但是,您可以使用conda-forge通道(如果已經安裝了xlwings,請用upgrade替換安裝):
conda install -c conda-forge xlwings
注意:在安裝過程中,xlwings也是有依賴項的,但是依賴項通過conda或pip自動安裝
Windows:pywin32
Mac:psutil,appscript
如果原來安裝過,使用如下操作更新
要更新到最新的xlwings版本,請在命令提示符中運行以下內容:
pip install --upgrade xlwings
或者:
conda update -c conda-forge xlwings
通過運行以下內容(確保先關閉Excel),確保您的Excel加載項版本與您的Python軟件包保持同步:
xlwings addin install
若要卸載xlwings,移步下面的操作
要完全卸載xlwings,請先卸載加載項,然后使用安裝xlwings軟件包時使用的相同方法(pip或conda)卸載xlwings軟件包:
xlwings addin remove
然后
pip uninstall xlwings
或者:
conda remove xlwings
最后,手動刪除個人文件夾中的.xlwings目錄(如果存在)。
3.xlwings詳細使用
在我們操作之前可以先了解下,如下內容:
• 新建:創建一個不存在的工作薄或者工作表
• 打開:打開一個已經存在的工作薄
• 引用:就是告訴程序,你要操作哪個對象。比如你打開了A、B、C三個工作薄,現在你想操作A工作薄,就要先引用A
• 激活:我們可以同時打開多個工作薄,但是一次只能操作一個工作簿,我們正在操作的這個工作薄稱為**當前活動工作薄。
在xlwings中
• Excel程序用App來表示,多個Excel程序集合用Apps表示;
• 單個工作簿用Book表示,工作簿集合用Books表示;
• 單個工作表用Sheet表示,工作表集合用Sheets表示;
• 區域用Range表示,既可以是一個單元格,也可以是一片單元格區域。
對Excel進行操作主要使用如下三個類:
import xlwings as xw
xw.App 打開一個excel應用
xw.Book 創建一個工作薄
xw.Sheet 創建一個工作表
初試:創建一個excel表格并保存
import xlwings as xw
# 打開excel,參數visible表示處理過程是否可視,add_book表示是否打開新的Excel程序
with xw.App(visible=True,add_book=False) as app:
# 創建一個工作薄
book = app.books.add()
# 工作薄中創建一個sheet表
sht = book.sheets.add()
# 向表格的A1單元格寫入“Hello Python”
sht.range('A1').value = 'Hello Python'
# 保存
book.save('./test.xlsx')
理解App
App就是我們打開的一個Excel應用,在我們程序員看來一個App對象就是一個Excel的實例,在此實例下創建工作薄。因此我們要創建工作簿,就必須先創建App實例。一個App實例可以創建多個工作簿Book。
使用xlwings可以創建一個或者多個App,而每個App中又可以創建多個工作薄Book,并且多個App之間是相互獨立的。
要使用xlwings就需要先引用該庫
import xlwings as xw
app=xw.App()
pid = app.pid
print(pid) # 6260就是這個App的PID
綜合:
import xlwings as xw
app=xw.App()
pid = app.pid
# 就是這個App的PID
app1=xw.App()
pid1 = app1.pid
print(pid,pid1) # 6260
count = xw.apps.count
print(count)
print(xw.apps.keys())
創建App
我們可以通過xw.app()創建一個新的app實例
app=xw.App(visible=True,add_book=False) # 當然也可以通過app.visible = True設置可見性
其中可以設置參數visible:用來設置程序是否可見,True表示可見(默認),Flase不可見。addbook用來設置是否自動創建工作簿,True表示自動創建(默認),False不創建。當設置成addbook=False時,可以創建App,但是還未生成PID,只有當這個App創建了工作簿后,才會生成自己的PID 。
創建成果后可以查看pid
import xlwings as xw
app=xw.App()
pid = app.pid
print(pid) # 6260就是這個App的PID
綜合:
import xlwings as xw
app=xw.App()
pid = app.pid
# 就是這個App的PID
app1=xw.App()
pid1 = app1.pid
print(pid,pid1) # 6260
count = xw.apps.count
print(count)
print(xw.apps.keys())
結果:
可以引用某個app實例進行操作并激活
app = xw.apps[992]
app.activate() # 或者app.activate(steal_focus=True)
# 當steal_focus=True時, Excel程序變為最前臺的應用,并且把焦點從Python切換到Excel
在操作一個app對象的時候要先引用工作薄,但是引用并不代表激活,激活就是當前操作的工作薄。
常用的屬性有:
app.screen_updating:打開屏幕更新,我們可以看到xlwings對Excel進行操作的過程,關閉更新可以加速腳本運行。默認是打開的。
app.display_alerts:在使用Excel的過程中,經常會遇到一些提醒信息,比如關閉前的保存提示、數據有效性的警告窗口,若想隱藏這些窗口可以設置成False。如果提醒信息是需要反饋的,Excel會選擇默認的方式True
import xlwings as xw
app = xw.App(visible=False, add_book=False) # 界面設置
app.display_alerts = False # 關閉提示信息
app.screen_updating = False # 關閉顯示更新
wb = app.books.add() # 創建新的工作簿
sht = wb.sheets['Sheet1'] # 實例化工作表
sht.range('A1').value = 'Hello World!'
print(sht.range('A1').value) # 讀取
wb.close()
app.kill()
其中關閉app有兩種方式,通過測試使用kill()函數更快些。
app.kill():通過殺掉進程,強制Excel app退出
app.quit():退出excel程序,不保存任何工作簿
工作簿Book與Books
前面介紹了app,并且一個app可以包含多個工作薄,如何在app中創建工作薄呢?
創建Book對象
官方給出的創建工作薄的方式如下:
兩種方式的區別:方式1是創建一個新的App,并在新App中新建一個Book,方式2是在當前App下新建一個Book
如果是打開一個已經存在的則使用:
wb = app.books.open('絕對或者相對路徑的excel文件')
'或者
wb = xw.Book('絕對或者相對路徑的excel文件')
其中創建Book對象的參數如下:
Book(fullname=None, updatelinks=None, readonly=None, format=None,
password=None, writerespassword=None, ignorereadonlyrecommended=None,
origin=None, delimiter=None, editable=None, notify=None, converter=None,
addtomru=None, local=None, corruptload=None, impl=None)
詳細情況可以參考文檔:https://docs.microsoft.com/zh-cn/office/vba/api/excel.workbooks.open
xw.Book('絕對或者相對路徑的excel文件')既可以打開工作薄也可以引用工作簿。
激活與保存
wb.activate()
# 如果steal_focus=True, 則把窗口顯示到最上層,并且把焦點從Python切換到Excel
wb.activate(steal_focus=True)
保存工作薄:
wb.save()
# 或者使用指定路徑保存
wb.save('存儲路徑')
關閉
關閉工作薄也很簡單,就是使用wb.close(),注意:wb.close()只是關閉并不會保存,所以在關閉之前必須要使用save()進行一下保存才可以。可以考慮使用with搭建上下文,實現關閉資源。
import xlwings as xw
app=xw.App(visible=True,add_book=False)
app.display_alerts=False
app.screen_updating=False
# 文件位置:filepath,打開test文檔,然后保存,關閉,結束程序
filepath=r'test.xlsx'
wb=app.books.open(filepath)
wb.save()
wb.close()
app.quit()
若想獲取當前活動App中的所有books,可以直接通過下列方式
import xlwings as xw
# 當前活動App的工作簿集合
books = xw.books
# 或者使用app.books獲取
# books = app.books
工作表Sheet與查看所有Sheets
新建Sheet
sht = wb.sheets.add()
# 或者
sht = wb.sheets.add('test',after='sheet2')
參數1為工作表名稱,省略的話為Excel默認名稱,參數2為插入位置,可選before或者after
若想引用某一個Sheet,可以通過下面方式
sht = wb.sheets('sheet1') # 指定名稱獲取sheet工作表
sht = wb.sheets(1) # 根據序號獲取
sht = xw.sheets.active #獲取當前活動的工作表
import xlwings as xw
app=xw.App(visible=True,add_book=False)
app.display_alerts=False
app.screen_updating=False
# 文件位置:filepath,打開test文檔,然后保存,關閉,結束程序
filepath=r'test.xlsx'
wb=app.books.open(filepath)
# add()是在現有的sheets集合列表中追加新的Sheet
sht1 = wb.sheets.add()
sht2 = wb.sheets.add()
print(wb.sheets.count)
sht3 = wb.sheets(1)
# sht1.activate()
sht3.range('A1').value = 'Hello Running'
wb.save('test1.xlsx')
wb.close()
app.quit()
sheet對象可以調用的方法有:
sheet.activate sheet.charts sheet.index
sheet.api sheet.clear sheet.name
sheet.autofit sheet.clear_contents sheet.names
sheet.book sheet.delete sheet.pictures
sheet.cells sheet.impl sheet.range
......
常用的有:
# 清除工作表所有內容和格式
sht.clear()
# 清除工作表的所有內容但是保留原有格式
sht.clear_contents()
# 刪除工作表
sht.delete()
# 自動調整行高列寬
sht.autofit('c')
# 在活動工作簿中選擇
sht.select()
可以通過屬性獲取獲取工作表的名稱、所有單元格的區域對象、當前工作表的索引值
sht.name sht.cells sht.index sht.names
引用區域與單元格操作
在操作區域或者單元格之前,首先就要引用他們,其實就是表明你要操作的區域或者單元格是哪些。可以認為區域是多個單元格。
引用區域的方式有很多種,下面列舉一下常見的引用方式:
xw.Range('A1:D4')
xw.Range((1,1), (4,4))
xw.Range(xw.Range('A1'),xw.Range('D4'))
xw.Range(xw.Range('A1:E6'),xw.Range('C3:D7'))
xw.Range('NamedRange')
app.range("A1") # 注意是小寫的range
sht.range('A1')
xw.books['MyBook.xlsx'].sheets[0].range('A1')
sht['A1']
sht['A1:D4']
sht[0,5]
sht[:5,:5]
區域管理可以通過如下方式:
range.offset(rowoffset=5,columnoffset=2) 表示偏移,rowoffset行偏移量(正數表示向下偏移,負數相反),columnoffset列偏移量(正數表示向右偏移,負數相反)
注意:是將選區范圍進行偏移,內容不進行偏移
range.expand(mode='down') 擴展區域,參數可選取 'down' , 'right' ,'table' ,類似我們使用向下、向右或者下右方的區域擴展操作。
range.resize(rowsize=4, columnsize=2) 表示調整選中區域的大小,參數表示調整后區域的行、列的數量。
range.current_region 表示全選 類似Ctrl + A
對區域或單元格進行操作:
存儲數據
儲存單個值
# ".value“屬性
sht.range('A1').value=1
儲存列表
# 將列表[1,2,3]儲存在A1:C1中
sht.range('A1').value=[1,2,3]
# 將列表[1,2,3]儲存在A1:A3中
sht.range('A1').options(transpose=True).value=[1,2,3]
# 將2x2表格,即二維數組,儲存在A1:B2中,如第一行1,2,第二行3,4
sht.range('A1').options(expand='table').value=[[1,2],[3,4]]
讀取數據
讀取單個值
# 將A1的值,讀取到a變量中
a=sht.range('A1').value
將值讀取到列表中
#將A1到A2的值,讀取到a列表中
a=sht.range('A1:A2').value
# 將第一行和第二行的數據按二維數組的方式讀取
a=sht.range('A1:B2').value
清除與刪除
# 清除range的內容
rng.clear_contents()
# 清除格式和內容
rng.clear()
# 刪除
rng.delete(shift=None)
其他設置
# 獲取數字格式
rng.number_format
# 設置數字格式
rng.number_format = '0.00%'
rng.insert(shift=None, copy_origin='format_from_left_or_above')
# 返回區域第一行的行號
rng.row
# 返回區域的第一列的號,注意返回的列號不是ABCD,而是1234
rng.column
# 獲取行高 或者設置行高
rng.row_height
rng.row_height = 20
# 獲取列寬或設置列寬
rng.column_width
rng.column_width = 20
# 自適應行高列寬
rng.autofit()
rng.columns.autofit()
rng.rows.autofit()
# 合并單元格
rng.merge(across=False)
rng.merge_area # 返回合并單元格區域
rng.merge_cells # 返回True或者False,測試是否在合并單元格區域
rng.unmerge() # 取消單元格合并
# 背景色
rng.color # 獲取指定區域的背景色
xw.Range('A1').color = (255,255,255) # 設置背景色
xw.Range('A2').color = None # 去除背景色
其他參考
range.add_hyperlink range.clear_contents range.count
range.address range.color range.current_region
range.api range.column range.end
range.autofit range.column_width range.expand
range.clear range.columns range.formula
...等等
range.add_hyperlink('https://www.baidu.com','百度')
range.color = (128,128,128) RGB通道顏色,可獲取or設置
range.row/column 獲取第幾行/列,注意是第幾而不是下標
range.formula 可以設置計算表達式,用來進行表內計算
range.current_region 返回當前range所在區域的區域表達,這個比較難描述,好比一個Excel中互相連接的單元格都是連城一片,兩個片之間沒有任何相鄰就是互相獨立的。
range.count 返回這個range中共有多少單元格,合并單元格仍然按未合并的算
range.offset(a,b) 獲取到當前range向右a格,向下移動b格同樣大小的那片區域,ab可以為負值
range.rows/columns 返回行/列的各個range對象
range.expand
參考案例代碼:
批量寫入并讀取數據
import xlwings as xw
wb = xw.Book()
sht = wb.sheets.active
# 向工作表中寫入行列值
for i in range(1, 6):
for j in range(1, 6):
sht.range(i, j).value = '({}, {})'.format(i, j)
print(sht.range((1, 1), (5, 5)).expand().value) # 批量讀取
print(sht.range(1, 1).expand('right').value) # 按行讀
print(sht.range(1, 1).expand('down').value) # 按列讀
wb.close()
提前設置好表格的顏色,如圖
import xlwings as xw
from itertools import product
app = xw.App(visible=False) # 隱藏Excel
wb = app.books.open('test.xlsx') # 打開工作簿
sht = wb.sheets['Sheet1'] # 實例化工作表
for cell in list(map(''.join, product('ABCDEFGH', '1'))): # A1 B1 C1 D1 E1 F1 G1 H1
print(cell, sht.range(cell).color) # 填充顏色
wb.close()
局中插入圖片
截屏2021-11-22 下午8.40.22
import os
import xlwings as xw
wb = xw.Book()
sht = wb.sheets['Sheet1']
rng = sht.range('A1')
fileName = os.path.join(os.getcwd(), 'aa.png')
width, height = 120, 100 # 指定圖片大小
left = rng.left + (rng.width - width) / 2 # 居中
top = rng.top + (rng.height - height) / 2
sht.pictures.add(fileName, left=left, top=top, width=width, height=height)
wb.save('test2.xlsx')
wb.close()
綜合案例:
import xlwings as xw
wb = xw.Book()
sht = wb.sheets[0]
info_list = [['110202111111234','帳篷',5],
['110202111118891','行李箱','16'],
['110202111111004','微波爐','20'],
['110202111132741','電冰箱','13'],
['110202111109852','樂事薯片','30'],
['110202111112030','魯花花生油','12'],
['110202111190391','羽絨服','9'],
['110202111122319','防曬霜','18'],
]
# 寫入表頭
titles = [['商品編號','商品名稱','數量']]
sht.range('a1').value = titles
# 寫入數據
sht.range('a2').value = info_list
# 保存數據
wb.save('goods.xlsx')
若想更新里面的數據,由于有些商品被賣出,商品數量就會發生變化。另外還有一批貨是新引入的。參考代碼如下:
import xlwings as xw
wb = xw.Book()
sht = wb.sheets[0]
info_list = [['110202111111234','帳篷','5'],
['110202111118891','行李箱','16'],
['110202111111004','微波爐','20'],
['110202111132741','電冰箱','13'],
['110202111109852','樂事薯片','30'],
['110202111112030','魯花花生油','12'],
['110202111190391','羽絨服','9'],
['110202111122319','防曬霜','18'],
]
# 寫入表頭
titles = [['商品編號','商品名稱','數量']]
sht.range('a1').value = titles
# 寫入數據
sht.range('a2').value = info_list
# 保存數據
wb.save('goods.xlsx')
# 讀取數據
goods_list = sht.range('a2').expand('table').value
for goods in goods_list:
goods[0] = str(int(goods[0]))
goods[2] = int(goods[2])
print(goods_list)
new_info = [['110202111111234','帳篷',5],
['110202111118891','行李箱',16],
['110202111111004','微波爐',20],
['110202111132741','電冰箱',10],
['110202111124660','羊毛衫',8],
['110202111109852','樂事薯片',10],
['110202111112030','魯花花生油',12],
['110202111190391','羽絨服',0],
['110202111122319','防曬霜',9],
['110202111124560','牛仔褲',18],
['110202111134798','老爹鞋',11]]
# 去重
extra = [i for i in new_info if i not in goods_list]
# print(extra)
# 讀取extra每個商品的包裹號,判斷是否存在并更新,然后添加
ids = sht.range(2, 1).expand('down').value
ids = [str(int(id)) for id in ids]
rows = len(sht.range('a2').expand('table').value)
# 更新已有數據的庫存
for goods in extra:
if goods[0] in ids:
row_number = ids.index(goods[0])
print(row_number,goods[1])
sht[row_number+1,2].value = goods[2]
else:
for i in range(3):
sht[rows+1,i].value =goods[i]
rows+=1
wb.save('goods.xlsx')
結果:
更多關于python培訓的問題,歡迎咨詢千鋒教育在線名師。千鋒教育擁有多年IT培訓服務經驗,采用全程面授高品質、高體驗培養模式,擁有國內一體化教學管理及學員服務,助力更多學員實現高薪夢想。