一?將Excel用作數據查看器
1.導包
import datetime as dt
import xlwings as xw
import pandas as pd
import numpy as np
2.view 函數
創建一個基于偽隨機數的DataFrame,它有足夠多的行,使得只有首尾幾行會被顯示。
df = pd.DataFrame(data=np.random.randn(100, 5),columns=[f"Trial {i}" for i in range(1, 6)])
print(df)
xw.view(df)
view 函數可以接受所有常見的 Python 對象,包括數字、字符串、列表、字典、元組、NumPy 數組和 pandas DataFrame。
在默認情況下,它會打開一個新的工作簿,然后將對象粘貼到第一張工作表的 A1 單元格。
不必每次都打開一個新的工作簿,你也可以通過為 view 函數提供一個 xlwings sheet 對象作為第二個參數來重復利用同一個工作簿文件:xw.view(df, mysheet)。
自動打開,未展示完全。?
二?xlwings 的使用方法
1.xw.Book()
?的不同用法
1.xw.Book()
:創建新工作簿
?
wb = xw.Book() 和 wb = app.books.add() 都是新建一個工作簿,有什么區別?
在?
xlwings
?中,xw.Book()
?和?app.books.add()
?都可以用于創建新工作簿,但它們在底層實現和使用場景上有以下區別。
xw.Book()
:如果沒有活動的Excel實例,它會啟動一個新的,然后新建一個工作簿。如果有活動的實例,比如用戶已經手動打開了Excel,那么它會在這個實例中新建工作簿。無需顯式創建?App
?對象,適合快速操作。
app.books.add()
:需要先有一個app
對象,通過xw.App()
創建。在指定的?app
?實例中新建工作簿。適合需要同時操作多個 Excel 實例或工作簿的場景。
xw.Book()
更自動化,適合簡單場景;app.books.add()
更明確,適合需要精細管理的情況。
補充:如果你在兩個 Excel 實例中打開了同一個工作簿,或者想要指定某個 Excel 實例打開某個工作簿,就不能再使用 xw.book 了。此時需要使用?books 集合。
.books方法
xw.apps[key].books
表示?Excel 實例中所有打開的工作簿集合。訪問工作簿:
通過索引:
app.books[0]
?獲取第一個工作簿。通過名稱:
app.books['Book1.xlsx']
?按名稱獲取。myapp 代表一個 xlwings app 對象。(myapp=xw.App())如果將 myapp.books 替換成 xw.books,則 xlwings 會使用活動的 app。![]()
2.xw.Book("Book1")
:引用未保存的未命名工作簿
?
xw.Book() 和 xw.Book("Book1") 的區別?
xw.Book()
:創建一個全新的 Excel 工作簿。如果當前沒有打開的 Excel 實例,xlwings 會自動啟動一個。新工作簿默認命名為?
Book1
(如果未指定其他名稱)。該工作簿不會自動保存,需手動調用?.save()
?方法。
xw.Book("Book1")
:嘗試打開已存在的名為 "Book1" 的工作簿。如果名為 "Book1" 的工作簿已打開,直接返回該工作簿的引用。如果名為 "Book1" 的工作簿未打開但存在(即文件存在于磁盤),xlwings 會打開它。如果文件不存在,會拋出?
FileNotFoundError
。
3.xw.Book("Book1.xlsx")
:引用已保存的文件?
路徑也可以是絕對路徑。
?4.xw.books.active
:獲取活動工作簿
返回當前 Excel 實例中活動的工作簿對象,直接獲取用戶當前正在操作的 Excel 工作簿對象。
2.xw.sheets[ ]
:訪問工作表集合
返回工作簿中所有工作表的集合(類似列表)。
1.通過名稱或索引訪問特定工作表
?
2.遍歷所有工作表
3.添加工作表
4.刪除工作表
5.檢查工作表是否存在
3.xw.range()的不同用法
.range方法是用來操作Excel單元格區域的。
1.對單個單元格
1.通過單元格名字操作單元格
補充:.value方法。
.value
?是?Range 對象的屬性。讀取:
cell_value = sheet.range("A1").value
print(cell_value)
寫入:
sheet.range("A1").value = "New Value"
sheet1.range("A1").value = [[1, 2], [3, 4]] 這行代碼是什么意思,A1這一個單元格里面的數據是[1, 2], [3, 4]嗎?
自動擴展寫入范圍:雖然你指定了?
A1
?這個單個單元格,但當你給一個單元格賦值一個二維列表(如?[[1,2], [3,4]]
)時,xlwings 會自動將數據擴展到相鄰的單元格區域。數據會被寫入到?A1:B2
?的區域。這個A1相當于是指定從A1單元格開始寫入數據而不是寫入A1單元格。賦予二維列表(如?[[1,2], [3,4]]
),xlwings 會將其視為多行多列的數據,并自動擴展寫入到連續的單元格區域。
2.通過行列索引操作
2.對多個單元格(范圍)
1.命名范圍操作
2.批量操作整行/整列
補充:索引和切片。
3.公式操作
4.多區域操作
3.range 對象的 options 方法
對應:5.Pandas :DataFrame 的使用——數據操作→9.將 DataFrame 寫入 Excel
range.options()
?方法,是用于動態控制 Excel 數據讀寫時的值處理方式的。只有在調用?value
?屬性時,options
?的設置才會生效。
options()
?本身不會立即處理數據,它只是定義了一組規則。當調用?.value
?時,xlwings
?會根據?options
?的規則,對?range
?區域的數據進行處理,返回結果。

options()
?用于定義讀取或寫入數據時,值的轉換規則。
常見的選項包括:
convert
:控制數據類型轉換(如將 Excel 中的數字文本轉為 Python 的整數)。
dates
:處理日期格式(如將 Excel 的日期序列轉為 Python 的?datetime
?對象)。
numbers
:控制數字的解析方式(如科學計數法、千分位分隔符)。
補充:convert 參數可以接受的值。
4.對 sheet 對象進行索引和切片來獲得?range 對象
補充:對 sheet 對象進行索引 / 切片和使用range 對象之間的區別。
sheet 對象在 xlwings 中代表 Excel 的工作表。用戶可能通過sheet[行, 列]或者sheet[:行, :列]這樣的索引或切片方式來操作單元格。而range對象則是通過sheet.range("A1")或者sheet.range("A1:B2")。
?
5.從 0 開始的索引和從 1 開始的索引的說明
作為一個 Python 包,只要你通過 Python 的索引或切片語法(通過方括號)訪問元素,xlwings 就始終使用從 0 開始的索引。但是?xlwings 的 range 對象使用的是從 1 開始的行列索引。那么可以使用 sheet[row_selection, column_selection] 語法。
6.xw.name()和 xw.fullname()
xw.name
:返回 Excel 應用程序的簡短名稱(通常是 "Microsoft Excel")。
示例輸出:"Microsoft Excel"
xw.fullname
:返回 Excel 應用程序的完整名稱(包含版本信息,如 "Microsoft Excel 365")。
示例輸出:"Microsoft Excel 365"
?
7.xw.app()的不同用法
.app是指Excel應用程序實例的接口。通過xw.App()來啟動Excel實例,或者使用現有的實例。
.app
?用于控制 Excel 應用程序級別的操作(如可見性、屏幕更新、計算模式等)。
1.啟動/關閉 Excel 實例
1.啟動新實例
默認可見。
2.連接已打開的 Excel 實例
3.從打開的工作簿中獲取app對象?
2.控制 Excel 的行為
3.打開/操作/保存并關閉工作簿
1.打開工作簿
2.操作工作簿
1.列出各實例中打開的工作簿名稱
通過列表推導式。
?2.寫入值
3.保存并關閉工作簿
4.獲取?app?的鍵
App
?對象代表一個 Excel 應用程序實例,可以獲取其唯一標識符(即“鍵”)。
1.app.pid
返回 Excel 進程的唯一數字標識符(Process ID),由操作系統分配。
?
2.app.hwnd
?
返回窗口的唯一標識符(僅 Windows 有效)。
補充:xw.apps.keys()
app.pid 和 app.hwnd
?是App對象的屬性。xw.apps.keys()會返回所有正在運行的Excel實例的進程ID列表。
xw.apps是一個類似字典的對象,其中每個鍵對應一個Excel實例的標識符,而值則是App對象本身。所以xw.apps.keys()應該返回所有當前運行的Excel實例的鍵(它們的標識符)。?
5.退出 Excel 實例
6..caller()
?
如果你通過 Excel 中的 VBA 宏、按鈕或其他方式運行 Python 代碼,.caller()
?會返回調用代碼時正在運行的 Excel 應用程序實例。
返回一個?xlwings
?的?App
?對象,使你可以在 Python 中直接操作觸發代碼的 Excel 應用程序。
8.xw.save()和 xw.close()
三?xlwings?的高級用法
1.批量操作工作表
2.創建?Excel 圖表
charts 集合的 add 方法。
向 Excel 工作表插入一個新的圖表。返回一個?Chart
?對象,代表新添加的圖表,可以通過該對象進一步配置圖表(如設置類型、數據源等)。
top=sheet1["A19"].top
:圖表的頂部位置與單元格?A19
?的頂部對齊。
left=sheet1["A19"].left
:圖表的左側位置與單元格?A19
?的左側對齊。
圖表會被放置在單元格?A19
?的位置,覆蓋該單元格。
chart.chart_type = "column_clustered":
將圖表的類型設置為簇狀柱形圖(一種常見的柱狀圖類型)。
chart.set_source_data(sheet1["A15"].expand()):設置圖表數據源
sheet1["A15"].expand()
:
從單元格?A15
?開始,自動擴展選擇連續的、非空的數據區域。
set_source_data
:
將上述擴展后的數據區域設置為圖表的數據源,圖表會根據這些數據生成對應的柱狀圖。
補充:其他例子
3.結合 Matplotlib
將?Matplotlib 圖像放入?Excel 中。
在處理圖片時,一定要確保安裝了 Pillow,它是 Python 中常用的圖片處理庫。Pillow 能夠保證圖片在 Excel 中有正確的尺寸和比例。Anaconda 中包含了 Pillow。
當使用 pandas 的默認繪圖后端時,創建的是一張 Matplotlib 的圖像。
要將這樣的圖 像放進 Excel 中,首先要獲取它的 figure 對象,然后將其作為參數傳遞給pictures.add, pictures.add 會將 Matplotlib 圖像轉換為圖片然后發送至 Excel。pictures.add
?方法是?xlwings
?庫中的一個功能,用于將圖片添加到 Excel 工作表中。
pictures.add
?:將圖片(如生成的圖表)插入到 Excel 工作表中。返回一個?Picture
?對象,代表插入的圖片,可以通過該對象進一步配置圖片(如調整位置、大小等)。
除了接受 Matplotlib 圖像, pictures.add 也可以接受磁盤上的圖片路徑。
image
:要插入的圖片對象(如?matplotlib
?的?Figure
?對象)。
name
(可選):圖片的名稱(字符串)。
update
(可選):如果為?True
,更新現有同名圖片;否則添加新圖片(默認?False
)。
left
(可選):圖片左側距離工作表左側的位置(單位:點)。
top
(可選):圖片頂部距離工作表頂部的位置(單位:點)。
width
(可選):圖片的寬度(單位:點)。
height
(可選):圖片的高度(單位:點)。
?
代碼舉例:
%matplotlib inline
:這是一個魔術命令,用于在 Jupyter Notebook 中直接顯示?matplotlib
?生成的圖表。圖表會內嵌在 Notebook 的單元格下方,而不是彈出一個獨立的窗口。
plt.style.use("seaborn")
:設置?matplotlib
?的圖表風格為?"seaborn"。seaborn
?是一種現代、美觀的統計圖表風格,由同名庫?seaborn
?提供。使用此風格后,圖表的網格、顏色、字體等視覺元素會自動調整為?seaborn
?的默認樣式。
ax = df.T.plot.bar()
:生成一個柱狀圖,并返回?Axes
?對象。
df.T
:對 DataFrame?df
?進行轉置(行和列交換)。轉置后,原來的行索引(Last Year
?和?This Year
)會變成列名,原來的列名(North
?和?South
)會變成行索引。轉置是為了調整圖表的方向,使柱狀圖的分組更直觀。
.plot.bar()
:調用?pandas
?的繪圖方法生成柱狀圖。
返回的?ax
?是一個?Axes
?對象,代表圖表的坐標軸和繪圖區域。
補充:
Figure
?對象和?Axes
?對象在?
matplotlib
?中?Figure
?對象代表整個圖表(包括所有子圖、標題、圖例等元素)。Axes
?對象代表圖表中的一個子圖或坐標軸區域。一個?
Figure
?對象可以包含多個?Axes
?對象(例如,通過?plt.subplots()
?創建多個子圖)。
fig = ax.get_figure()
:從?Axes
?對象中獲取關聯的?Figure
?對象。
.get_figure()
?:從?Axes
?對象中獲取其所屬的?Figure
?對象。
保存圖表:通過?Figure
?對象可以保存整個圖表為文件(如?fig.savefig("chart.png")
)。
調整圖表布局:通過?Figure
?對象可以調整圖表的全局布局(如?fig.tight_layout()
)。
獲取圖表屬性:通過?Figure
?對象可以訪問圖表的尺寸、分辨率等屬性。
補充:
.get_figure()
?方法是?matplotlib
?中用于從?Axes
?對象獲取其所屬?Figure
?對象的關鍵方法。通過?Figure
?對象,用戶可以執行保存圖表、調整布局等高級操作。
補充:想使用新的圖像來更新圖片
只需調用 update 方法并傳遞另一個 figure 對象即可。雖然這樣做會替換 Excel 中的圖片,但會保留位置、尺寸、名稱等屬性。
(df + 1)
:對 DataFrame?df
?中的每個元素加 1。
轉置后:
.plot.bar()
:調用?pandas
?的繪圖方法生成柱狀圖。返回的?ax
?是一個?Axes
?對象,代表圖表的坐標軸和繪圖區域。
plot = plot.update(ax.get_figure()):
用新的?Figure
?對象更新已有的圖表對象。
4.已定義名稱集合
1.什么是已定義名稱
在 Excel 中,我們通過為區域、公式和常量賦予名稱來創建已定義名稱。為一個區域命名是常見情況,這種區域被稱作具名區域。利用具名區域,你可以在公式和代碼中使用描述性名稱而不是抽象地址(A1:B2)來引用一個 Excel 區域。
補充:
具名區域:給某個單元格或單元格區域賦予一個名稱(如?
SalesData
),方便在公式或圖表中引用。全局作用域:名稱在整個工作簿中唯一,任何工作表都能引用。
工作表作用域:名稱僅在當前工作表中唯一,復制到其他工作表時會自動重命名。
利用具名區域讀寫值可以在不調整 Python 代碼的情況下重新組織工作簿。比如,即使插入新行導致了單元格的移動,但對應的名稱仍然引用的是原來的單元格。自定義名稱可以在全局工作簿作用域或局部工作表作用域中設置。
工作表作用域的優勢是在復制工作表時不用擔心重復的具名區域發生沖突。
什么是工作表作用域的優勢是在復制工作表時不用擔心重復的具名區域發生沖突?
假設你有一個工作表?
Sheet1
,其中定義了一個全局作用域的具名區域?SalesData
。當你復制?Sheet1
?到?Sheet2
?時:Sheet2
?中也會出現一個名為?SalesData
?的具名區域。如果此時你嘗試在公式或圖表中引用?SalesData
,軟件會不知道引用的是?Sheet1
?還是?Sheet2
?中的?SalesData
,導致沖突。
在 Excel 中,你可以在“公式 > 定義名稱”菜單項中添加自定義名稱。也可以選擇一個區域,然后將想要的名稱寫到名稱框(公式欄左邊的文本框)中,你可以在這里看到默認的單元格地址。
2.使用 xlwings 創建自定義名稱的方法
默認作用域是工作簿作用域。
sheet1["A1:B2"].name = "matrix1"
工作表作用域需要在工作表名稱前加上一個感嘆號。
sheet1["B10:E11"].name = "Sheet1!matrix2"
3.通過名稱訪問區域
1.用 sheet 方法
sheet1["matrix1"]
返回當前工作表(sheet1
)中定義的工作表作用域的具名區域。
原因:工作表對象只能“看到”其內部定義的作用域為當前工作表的具名區域。
2.用 book 方法
book.names
返回整個工作簿(book
)中定義的所有作用域的具名區域。
原因:工作簿對象可以“看到”全局作用域和工作表作用域的具名區域。
4.名稱有多種方法和屬性
1.獲取對應的range對象
book.names["matrix1"].refers_to_range
獲取工作簿中名為?matrix1
?的具名區域所引用的具體單元格范圍。
book
?是工作簿對象(如 Excel 文件)。book.names
?是工作簿中所有具名區域的集合,包含工作簿作用域和工作表作用域的具名區域。通過名稱?matrix1
?從?book.names
?集合中獲取特定的具名區域對象。
.refers_to_range
:是具名區域對象的一個屬性,返回該具名區域所引用的具體單元格范圍(Range 對象)。例如,如果?matrix1
?引用的是?Sheet1!A1:B2
,那么?.refers_to_range
?會返回這個范圍。
2.為常量或公式取名
使用add方法。
book.names.add("EURUSD", "=1.1151")
"EURUSD"
:是新具名區域的名稱,遵循命名規則(如不能以數字開頭,不能包含空格等)。
=1.1151"
:如果直接賦值(如?=1.1151
),表示該具名區域的值是?1.1151
。如果引用單元格(如?=Sheet1!A1
),表示該具名區域的值是?Sheet1!A1
?單元格的值。
5.通過 Python 來運行 VBA 宏
如果你手上有一些包含大量 VBA 代碼的舊式 Excel 項目,那么要將所有東西都遷移到 Python 并非易事。在這種情況下,可以通過 Python 來運行 VBA 宏。
macro()
?方法將 VBA 代碼橋接到 Python,使其像原生函數一樣調用。
步驟1:連接 VBA 工作簿
通過?xw.Book()
?加載包含 VBA 代碼的?vba.xlsm
?文件。返回一個?Book
?對象?vba_book
,用于操作該工作簿。
步驟2:綁定 VBA 函數
vba_book.macro( )
?將 VBA 函數?MySum
?綁定到 Python 變量?mysum
。此時?mysum
?像一個 Python 函數,可直接調用。
調用:
傳遞參數?5
?和?4
?給 VBA 函數?MySum ,
VBA 執行?x + y
?計算,返回結果?9.0
。
步驟3:綁定 VBA 子程序
同理,將 VBA 子程序?ShowMsgBox
?綁定到?show_msgbox
。子程序無返回值,但會執行操作(如彈窗)。
調用:
傳遞字符串參數?"Hello xlwings!"
。VBA 執行?MsgBox
?彈出消息框,需手動關閉后才能繼續。
步驟4:關閉工作簿
關閉book對象(一定要先關閉對話框)。若子程序彈出對話框未關閉,直接關閉工作簿會報錯。?