轉(zhuǎn)載請注明:陳熹 chenx6542@foxmail.com (簡書號:半為花間酒)
若公眾號內(nèi)轉(zhuǎn)載請聯(lián)系公眾號:早起Python
在之前的文章中我們分析了 openpyxl
庫操作 Python 庫的基礎(chǔ)大量和諸多案例衔肢,實(shí)際上能直接操作 Excel 文件的庫還有許多镊靴,如 xlwings
、xlrd
毕谴、xlwt
等等荣暮,今天我們就來學(xué)習(xí) xlwings
的一些操作
xlwings
和 openpyxl
許多區(qū)別決定了它們的能力是互為補(bǔ)充:
xlwings
:需要安裝有 Excel 軟件庭惜,支持.xls
和.xlsx
格式;可以調(diào)用 Excel 文件中 VBA 寫好的程序穗酥;和matplotlib
以及pandas
的兼容性強(qiáng)openpyxl
:不需要 Excel 軟件护赊,僅支持.xlsx
格式
安裝
xlwings
是一個非標(biāo)準(zhǔn)庫,需要在命令行中安裝
命令行:
Windows:徽標(biāo)鍵 + R —— 輸入cmd + 回車pip install xlwings
Mac:打開終端/Terminal輸入
pip3 install xlwings
前置知識
對 xlwings
的核心理解就在于下面這張圖:
可以看到砾跃,和 xlwings
直接對接的是 apps骏啰,也就是 Excel 應(yīng)用程序,然后才是 工作簿 books 和工作表 sheets抽高,這點(diǎn)和 openpyxl
有較大區(qū)別判耕,也正是因?yàn)榇耍?code>xlwings 需要依然安裝有 Excel 應(yīng)用程序的環(huán)境
代碼操作
1. 打開 Excel 程序
import xlwings as xw
app = xw.App(visible=True, add_book=False) # 程序可見,只打開不新建工作薄
app.display_alerts = False # 警告關(guān)閉
app.screen_updating = False # 屏幕更新關(guān)閉
2. 保存翘骂、退出壁熄、關(guān)閉
path = r"C:\Scientific Research\Python"
wb = app.books.open(path + r'\practice.xlsx')
wb.save() # 保存文件
wb.close() # 關(guān)閉文件
app.quit() # 關(guān)閉程序
這里需要注意帚豪,因?yàn)?xlwings
是以程序 apps 作為初級操作對象,因此開始和最后都是基于 app
的開和關(guān)
打開表格又分一下兩種情況草丧,即 固定 和 活動:
xw.Book(path + r'\practice.xlsx') # 固定打開表格
xw.books.open(path + r'\practice.xlsx') # 頻繁打開表格
固定和頻繁打開涉及到一個概念狸臣,稱活動對象,它使 xlwings
的操作更顯靈活:
# 活動應(yīng)用程序
app = xw.apps.active
# 活動工作簿
wb = xw.books.active # 在活動app
wb = app.books.active # 在特定app
# 活動工作表
sheet = xw.sheets.active # 在活動工作簿
sheet = wb.sheets.active # 在特定工作簿
# 活動工作表的Range
xw.Range('A1')
3. 新建 Excel 文件
path = r"C:\Scientific Research\Python"
wb = app.books.add()
wb.save(path + r'\new_practice.xlsx')
wb.close()
app.quit()
無論是新建還是打開都記得保存工作簿昌执、關(guān)閉工作簿烛亦、關(guān)閉程序
4. 讀取內(nèi)容
示例文件 practice.xlsx
如下:
下面的代碼部分不再顯示程序的開閉代碼,利于直觀看到重點(diǎn):
path = r"C:\Scientific Research\Python"
wb = app.books.open(path + r'\practice.xlsx')
# 類似 openpyxl 中的 sheet = workbook.active
sheet = wb.sheets.active
# 獲取單個單元格的值
A1 = sheet.range('A1').value
print(A1)
# 獲取橫向或縱向多個單元格的值仙蚜,返回列表
A1_A3 = sheet.range('A1:A3').value
print(A1_A3)
# 獲取給定范圍內(nèi)多個單元格的值此洲,返回嵌套列表厂汗,按行為列表
A1_C4 = sheet.range('A1:C4').value
print(A1_C4)
在
xlwings
中委粉,可以通過 sheet.range
獲取一個或多個單元格進(jìn)行操作另外也可以不用
sheet.range
獲取:
# 獲取單個單元格的值
A1 = sheet['A1'].value
print(A1)
# 獲取橫向或縱向多個單元格的值娶桦,返回列表
A1_A3 = sheet['A1:A3'].value
print(A1_A3)
# 獲取給定范圍內(nèi)多個單元格的值贾节,返回嵌套列表,按行為列表
A1_C4 = sheet['A1:C4'].value
print(A1_C4)
無論是單個單元格還是多個單元格衷畦,可以用 .value
直接獲取栗涂,輸出結(jié)果和使用 .range
完全一致,也避免了類似 openpyxl
對于多個單元格需要再建立循環(huán)遍歷才能獲取值祈争。
還有一種類似 pandas
切片獲取范圍內(nèi)所有值的方法:
sheet = wb.sheets.active
A1_B2 = sheet[:2, :2].value
print(A1_B2)
最后補(bǔ)充單元格的完全引用格式為:
# 輸出第一個 Excel 程序的第一個工作薄的第一張 sheet 的第一個單元格
print(xw.apps[0].books[0].sheets[0].range('A1'))
5. 寫入數(shù)據(jù)
# 寫入 1 個單元格
sheet.range('A2').value = '大明'
# 一行或一列寫入多個單元格
# 橫向?qū)懭階1:C1
sheet.range('A1').value = [1,2,3]
# 縱向?qū)懭階1:A3
sheet.range('A1').options(transpose=True).value = [1,2,3]
# 寫入范圍內(nèi)多個單元格
sheet.range('A1').options(expand='table').value = [[1,2,3], [4,5,6]]
例如斤程,如果要給 practice.xlsx
添加一行新的記錄,代碼如下:
import xlwings as xw
app = xw.App(visible=True, add_book=False)
app.display_alerts = False
app.screen_updating = False
path = r"C:\Scientific Research\Python"
wb = app.books.open(path + r'\practice.xlsx')
sheet = wb.sheets.active
sheet.range('A5').value = ['小蘭', 23, '女']
wb.save()
wb.close()
app.quit()
6. 獲取數(shù)據(jù)范圍
# 方法一
shape = sheet.used_range.shape
print(shape)
# 方法二
nrow = sheet.api.UsedRange.Rows.count
ncol = sheet.api.UsedRange.Columns.count
print(nrow)
print(ncol)
7. 輸出并修改行高列寬
# 輸出
print(sheet.range('A1:A2').row_height)
print(sheet.range('A1:A2').column_width)
# 修改
sheet.range('A1:A2').row_height = 15
sheet.range('A1:A2').column_width = 10
8. 獲取及設(shè)置公式
# 獲取公式
print(sheet.range('B2').formula_array)
# 寫入公式
sheet.range('B2').formula='=SUM(A1,A2)'
9. 獲取菩混、設(shè)置及清除顏色格式
# 獲取顏色
print(sheet.range('C1').color)
# 設(shè)置顏色
sheet.range('C1').color = (255, 0, 120)
# 清除顏色
sheet.range('C1').color = None
本文主要講述基礎(chǔ)操作忿墅,更多操作請閱讀官方文檔:https://docs.xlwings.org/en/stable/quickstart.html