如何使用 Python openpyxl 套件操作 Excel 連結?openpyxl Hyperlink 物件介紹
閱讀本節的先決條件是已經了解 Excel 儲存格物件Cell
,你可以檢視如何使用 Python openpyxl 套件操作 Excel 儲存格?openpyxl Cell 物件介紹一節來取得相關資訊。
Python openpyxl 套件中的 Excel 連結物件 Hyperlink
Pythonopenpyxl
套件中的Hyperlink
類別,屬於模組openpyxl.worksheet.hyperlink
,用於表示 Excel 儲存格中的連結。
什麽是 Excel 連結?
在 Excel 檔案中,Excel 連結類似於網頁中的超連結,當你點選他們時,Office 軟體會通過瀏覽器開啟某個網址,或者定位至某個工作表的 Excel 儲存格或範圍,采取哪種操作取決於 Excel 連結的設定。
使用 Python openpyxl 套件的 Hyperlink 物件建立 Excel 連結
使用 Pythonopenpyxl
套件的Hyperlink
物件的建構子,你可以建立新的 Excel 連結,這些連結可被設定到工作表的某個 Excel 儲存格中。
Hyperlink(ref=None, location=None, tooltip=None, display=None, id=None, target=None)
- ref 參數
ref
參數是一個字串,表示含有 Excel 連結的儲存格的位址,比如'A1'
。通過該參數指派的ref
變數,可能會被openpyxl
修改,因此,這裏的ref
參數是無關緊要的,如果開發人員自行建立Hyperlink
物件的話。- location 參數
location
參數是一個字串,表示 Excel 連結指向的 Excel 儲存格或範圍的位址,其格式為worksheet!address
(比如,SheetB!A1
),其中worksheet
為工作表名稱,address
為位址,如果指向的是本工作表中的儲存格或範圍,則worksheet
和!
可以省去(比如,A1:B2
)。- tooltip 參數
tooltip
參數是一個字串,他表示 Excel 連結對應的工具提示。需要說明的是,即便設定了tooltip
,一些 Office 軟體也不會按照tooltip
給出的值來顯示工具提示。- display 參數
display
參數是一個字串,他表示 Excel 連結在其對應的儲存格中應該顯示的文字,需要指出,Excel 儲存格中最終顯示的內容是由Cell
物件的value
屬性來決定的。- id 參數
id
參數是一個字串,用於識別 Excel 連結。如果連結對應的target
變數不為None
,那麽通過參數id
指派的id
變數,可能會被openpyxl
套件在儲存 Excel 檔案時修改,當id
變數為None
,或者id
變數的值不符合要求時。- target 參數
target
參數是一個字串,他可能是某個網路位址(比如,以http
,https
,mailto
開頭的位址),或者是某個 Excel 檔案的路徑(可以是相對路徑或絕對路徑)。
在讀取 Excel 檔案時,openpyxl
套件會建立 Excel 連結物件Hyperlink
。如果 Excel 連結並未指向儲存格或範圍,那麽Hyperlink
物件的location
變數可能為 Python 空值None
。如果 Excel 連結指向 Excel 儲存格或範圍,那麽Hyperlink
物件的id
變數可能為 Python 空值None
。如果 Excel 連結指向本工作表中的儲存格或範圍,那麽Hyperlink
物件的target
變數可能為 Python 空值None
。
Python openpyxl 套件的 Hyperlink 物件的變數
Pythonopenpyxl
套件的Hyperlink
物件擁有變數ref
,location
,tooltip
,display
,id
和target
,在未作出修改時,他們的值與傳遞給Hyperlink
建構子的引數的值相同。
使用 Python openpyxl 套件的 Cell 物件取得和設定 Excel 連結
Pythonopenpyxl
套件的Cell
物件的hyperlink
屬性,可用於取得或設定 Excel 儲存格中的連結。hyperlink
屬性的傳回值是一個Hyperlink
物件,如果 Excel 儲存格未包含連結,則Cell
物件的hyperlink
屬性傳回空值None
。
cell.hyperlink
cell.hyperlink = link
- link 值
link
是一個表示 Excel 連結的Hyperlink
物件,或者是一個表示連結目標的字串(他將對應Hyperlink
物件的target
變數),比如'https://www.bing.com/'
。要移除 Excel 儲存格中的連結,link
應該為空值None
。
openpyxl 套件的 Hyperlink 物件的 display 變數可能不會影響 Cell 物件的 value 屬性
當你通過openpyxl
套件的Cell
物件的hyperlink
屬性來設定 Excel 連結時,給出的Hyperlink
物件的display
變數無法影響 Excel 儲存格的值,即便是空白儲存格,Cell
物件也僅會將Hyperlink
物件的target
或location
變數的值設定為儲存格的內容。
在 Excel 檔案Link.xlsx
的工作表Hyperlinks
中,儲存格A1
擁有指向https://www.bing.com/
的連結,儲存格A2
擁有指向工作表Other
的範圍B1:B4
的連結。
我們為儲存格B1
設定了新的 Excel 連結,雖然給出了參數display
,但儲存格B1
並不會顯示Google
,而是顯示https://www.google.com/
。
# 開啟 Link.xlsx 中的工作表 Hyperlinks
import openpyxl
wb = openpyxl.load_workbook('Link.xlsx')
ws = wb['Hyperlinks']
# 顯示範圍 A1:A2 中的儲存格的連結
for row in ws['A1:A2']:
for cell in row:
print(f'{cell.hyperlink}, {cell.hyperlink.target}')
from openpyxl.worksheet.hyperlink import Hyperlink
# B1 儲存格不會顯示為 Google,而是 https://www.google.com/,參數 ref 並不正確,但沒有關系
ws['B1'].hyperlink = Hyperlink('XXXX', display='Google', target='https://www.google.com/')
# 直接通過網址來設定 Excel 連結
ws['C1'].hyperlink = 'https://www.python.org'
# 指向工作表 Other 的 A1 儲存格的連結
ws['D1'].hyperlink = Hyperlink('D1', location='Other!A1')
# 指向本工作表的 A1 儲存格的連結
ws['E1'].hyperlink = Hyperlink('E1', location='A1')
wb.save('Google.xlsx')
…
ref='A1', location=None, tooltip=None, display='Bing', id='rId1', https://www.bing.com/
…
ref='A2', location='Other!B1:B4', tooltip=None, display='Other 的 B1:B4 範圍', id=None, None
openpyxl 套件的 Cell 物件的 hyperlink 屬性僅適用於包含一個 Excel 連結的儲存格
雖然在一些 Office 軟體中,一個儲存格可以包含多個 Excel 連結,但openpyxl
的Cell
物件的hyperlink
屬性僅適用於包含一個 Excel 連結的儲存格,如果儲存格包含多個連結,那麽hyperlink
屬性會傳回空值None
。
使用 Python openpyxl 套件的 Cell 物件修改 Excel 連結
對於 Pythonopenpyxl
套件的Cell
物件的hyperlink
屬性所傳回的Hyperlinks
物件,你可以通過其變數來達到修改 Excel 連結的目的。
在下面的範例中,我們修改了儲存格A2
中的 Excel 連結,將其指向的儲存格的位址修改為Other
工作表的A1
儲存格。由於修改display
變數不會影響儲存格的內容,因此需要修改Cell
物件的value
屬性來更新儲存格顯示的資訊。
# 開啟 Link.xlsx 中的工作表 Hyperlinks
import openpyxl
workbook = openpyxl.load_workbook('Link.xlsx')
worksheet = workbook['Hyperlinks']
link = worksheet['A2'].hyperlink
# 修改工具提示和指向的儲存格位址
link.tooltip = '一個大概不會顯示的工具提示'
link.location = 'Other!A1'
# 修改 display 不影響儲存格的內容,因此修改 value 屬性
worksheet['A2'].value = '指向 Other 的 A1'
link.display = '不影響儲存格內容'
workbook.save('Modify.xlsx')
當 Excel 連結所在的儲存格移動時需要修改對應 Hyperlink 物件的 ref 變數
openpyxl
套件的Hyperlink
物件的ref
變數是含有 Excel 連結的儲存格的位址,因此,當儲存格移動時,Excel 連結對應的Hyperlink
物件的ref
變數應該被修改。以上工作需要由開發人員自行編寫程式碼完成。
當然,上述現象也意味著你不能隨意的修改Hyperlink
物件的ref
變數。
在下面的範例中,我們移動了儲存格A1
和A2
,由於之後僅修改了D1
儲存格中的連結的ref
,因此,Excel 檔案Move.xlsx
中的D2
儲存格中的連結將失效。
# 開啟 Link.xlsx 中的工作表 Hyperlinks
import openpyxl
workbook = openpyxl.load_workbook('Link.xlsx')
worksheet = workbook['Hyperlinks']
# 移動儲存格 A1,A2 至 D1,D2
worksheet.move_range('A1:A2', cols=3)
# 修改 D1 儲存格的連結的 ref
worksheet['D1'].hyperlink.ref = 'D1'
workbook.save('Move.xlsx')
使用 Python openpyxl 套件的 Cell 物件移除 Excel 連結
你可以通過將 Pythonopenpyxl
套件的Cell
物件的hyperlink
屬性設定為None
,來移除對應 Excel 儲存格中的連結,但連結的相關資訊(比如,某個網址或顯示文字)可能會被保留在儲存格中,因為將hyperlink
設定為None
並不影響Cell
的value
屬性。
在下面的例子中,雖然我們刪除了儲存格A1
中的連結,但 Excel 檔案Remove.xlsx
的Hyperlinks
工作表的A1
儲存格依然顯示為Bing
。
# 開啟 Link.xlsx 中的工作表 Hyperlinks
import openpyxl
workbook = openpyxl.load_workbook('Link.xlsx')
worksheet = workbook['Hyperlinks']
# 刪除 A1 儲存格中的連結
worksheet['A1'].hyperlink = None
workbook.save('Remove.xlsx')
程式碼
src/zh-hant/openpyxl/cells/hyperlinks·codebeatme/office-programming·GitHub