超全整理|Python 操作 Excel 庫(kù) xlwings 常用操作詳解!
回復(fù)“書籍”即可獲贈(zèng)Python從入門到進(jìn)階共10本電子書

大家好,我是早起。
在之前的文章中我們?cè)敿?xì)的講解了如何使用openpyxl 操作Excel,其實(shí)在Python中還有其他可以直接操作 Excel 文件的庫(kù),如 xlwings、xlrd、xlwt 等等,本文就將講解另一個(gè)優(yōu)秀的庫(kù)xlwings
開(kāi)頭還是想說(shuō)一下,各個(gè)庫(kù)之間沒(méi)有明確的好壞之分,每個(gè)庫(kù)都有其適合的應(yīng)用場(chǎng)景,并且xlwings 和 openpyxl 許多區(qū)別決定了它們的能力是互為補(bǔ)充:
“
xlwings:需要安裝有 Excel 軟件,支持.xls和.xlsx格式;可以調(diào)用 Excel 文件中 VBA 寫好的程序;和matplotlib以及pandas的兼容性強(qiáng)”
openpyxl:不需要 Excel 軟件,僅支持.xlsx格式
安裝
xlwings 是一個(gè)非標(biāo)準(zhǔn)庫(kù),需要在命令行中安裝,在終端(Mac)/命令行(Win)使用pip安裝即可,一般不會(huì)出現(xiàn)什么問(wèn)題。
pip?install?xlwings
前置知識(shí)
對(duì) xlwings 的核心理解就在于下面這張圖:
可以看到,和 xlwings 直接對(duì)接的是 apps,也就是 Excel 應(yīng)用程序,然后才是 工作簿 books 和工作表 sheets,這點(diǎn)和 openpyxl 有較大區(qū)別,也正是因?yàn)榇耍?code style="padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font-family: 'Operator Mono', Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(255, 100, 65);font-size: 13px;">xlwings 需要依然安裝有 Excel 應(yīng)用程序的環(huán)境
代碼詳解
一、打開(kāi)Excel程序
使用app打開(kāi)
import?xlwings?as?xw
app?=?xw.App(visible=True,?add_book=False)?#?程序可見(jiàn),只打開(kāi)不新建工作薄
app.display_alerts?=?False?#?警告關(guān)閉
app.screen_updating?=?False?#?屏幕更新關(guān)閉
二、保存、退出、關(guān)閉
這里需要注意,因?yàn)?xlwings 是以程序 apps 作為初級(jí)操作對(duì)象,因此開(kāi)始和最后都是基于 app 的開(kāi)和關(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)閉程序
打開(kāi)表格又分一下兩種情況,即 固定 和 活動(dòng):
xw.Book(path?+?r'\practice.xlsx')???#?固定打開(kāi)表格
xw.books.open(path?+?r'\practice.xlsx')?#?頻繁打開(kāi)表格
固定和頻繁打開(kāi)涉及到一個(gè)概念,稱活動(dòng)對(duì)象,它使 xlwings 的操作更顯靈活:
#?活動(dòng)應(yīng)用程序
app?=?xw.apps.active
#?活動(dòng)工作簿
wb?=?xw.books.active??#?在活動(dòng)app
wb?=?app.books.active??#?在特定app
#?活動(dòng)工作表
sheet?=?xw.sheets.active??#?在活動(dòng)工作簿
sheet?=?wb.sheets.active??#?在特定工作簿
#?活動(dòng)工作表的Range
xw.Range('A1')?
三、新建 Excel 文件
無(wú)論是新建還是打開(kāi)都記得保存工作簿、關(guān)閉工作簿、關(guān)閉程序
path?=?r"C:\Scientific?Research\Python"
wb?=?app.books.add()
wb.save(path?+?r'\new_practice.xlsx')?
wb.close()?
app.quit()?
四、讀取內(nèi)容
示例文件 practice.xlsx 如下:
下面的代碼部分不再顯示程序的開(kāi)閉代碼,利于直觀看到重點(diǎn):
path?=?r"C:\Scientific?Research\Python"
wb?=?app.books.open(path?+?r'\practice.xlsx')
#?類似?openpyxl?中的?sheet?=?workbook.active
sheet?=?wb.sheets.active
#?獲取單個(gè)單元格的值
A1?=?sheet.range('A1').value
print(A1)
#?獲取橫向或縱向多個(gè)單元格的值,返回列表
A1_A3?=?sheet.range('A1:A3').value
print(A1_A3)
#?獲取給定范圍內(nèi)多個(gè)單元格的值,返回嵌套列表,按行為列表
A1_C4?=?sheet.range('A1:C4').value
print(A1_C4)

在 xlwings 中,可以通過(guò) sheet.range 獲取一個(gè)或多個(gè)單元格進(jìn)行操作,另外也可以不用 sheet.range 獲取:
#?獲取單個(gè)單元格的值
A1?=?sheet['A1'].value
print(A1)
#?獲取橫向或縱向多個(gè)單元格的值,返回列表
A1_A3?=?sheet['A1:A3'].value
print(A1_A3)
#?獲取給定范圍內(nèi)多個(gè)單元格的值,返回嵌套列表,按行為列表
A1_C4?=?sheet['A1:C4'].value
print(A1_C4)
無(wú)論是單個(gè)單元格還是多個(gè)單元格,可以用 .value直接獲取,輸出結(jié)果和使用 .range 完全一致,也避免了類似 openpyxl 對(duì)于多個(gè)單元格需要再建立循環(huán)遍歷才能獲取值。
還有一種類似 pandas 切片獲取范圍內(nèi)所有值的方法:
sheet?=?wb.sheets.active
A1_B2?=?sheet[:2,?:2].value
print(A1_B2)

五、寫入數(shù)據(jù)
以下為寫入 1 個(gè)單元格、一行或一列寫入多個(gè)單元格、寫入范圍內(nèi)多個(gè)單元格代碼
#?寫入?1?個(gè)單元格
sheet.range('A2').value?=?'大明'
#?一行或一列寫入多個(gè)單元格
#?橫向?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)多個(gè)單元格
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()

六、獲取數(shù)據(jù)范圍
有兩種方法實(shí)現(xiàn)
#?方法一
shape?=?sheet.used_range.shape
print(shape)
#?方法二
nrow?=?sheet.api.UsedRange.Rows.count
ncol?=?sheet.api.UsedRange.Columns.count
print(nrow)
print(ncol)
七、輸出并修改行高列寬
#?輸出
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
八、獲取及設(shè)置公式
可以調(diào)用Excel公式,這是pandas無(wú)法完成的
#?獲取公式
print(sheet.range('B2').formula_array)
#?寫入公式
sheet.range('B2').formula='=SUM(A1,A2)'
九、 獲取、設(shè)置及清除顏色格式
當(dāng)然類似openpyxl等樣式修改也是支持的
#?獲取顏色
print(sheet.range('C1').color)
#?設(shè)置顏色
sheet.range('C1').color?=?(255,?0,?120)
#?清除顏色
sheet.range('C1').color?=?None
以上僅是針對(duì)一些常用操作給出代碼示例與講解,更多的操作可以閱讀官方文檔,大家也可以自己對(duì)比一下xlwings和其他庫(kù)在部分操作上的異同。未來(lái)我們也會(huì)更新基于xlwings的辦公自動(dòng)化案例!
-------------------?End?-------------------
往期精彩文章推薦:
解決安裝Pycharm后在C盤下生成大文件的問(wèn)題
一篇文章教會(huì)你使用Django根據(jù)現(xiàn)有數(shù)據(jù)庫(kù)反向生成models
手把手教你使用Django如何連接Mysql

歡迎大家點(diǎn)贊,留言,轉(zhuǎn)發(fā),轉(zhuǎn)載,感謝大家的相伴與支持
想加入Python學(xué)習(xí)群請(qǐng)?jiān)诤笈_(tái)回復(fù)【入群】
萬(wàn)水千山總是情,點(diǎn)個(gè)【在看】行不行
/今日留言主題/
隨便說(shuō)一兩句吧~~
