如何使用 openpyxl 處理 Excel 連結?Hyperlink 物件介紹
訂閱 480
閱讀本節的先決條件是已經了解 Excel 儲存格物件Cell,你可以檢視如何使用 openpyxl 處理 Excel 儲存格?Cell 物件介紹一節來取得相關資訊。
openpyxl Excel 連結物件 Hyperlink
openpyxl套件中的Hyperlink類別,屬於模組openpyxl.worksheet.hyperlink,用於表示 Excel 儲存格中的連結。
什麽是 Excel 連結?
Excel 連結類似於網頁中的超連結,當你點選他們時,Office 軟體會通過瀏覽器開啟某個網址,或者定位至某個工作表的儲存格或範圍,采取哪種操作取決於 Excel 連結的設定。
建立 Excel 連結
使用Hyperlink物件的建構子,你可以建立新的 Excel 連結,這些連結可被設定到工作表的某個儲存格中。
Hyperlink(ref=None, location=None, tooltip=None, display=None, id=None, target=None)
- ref 參數
ref參數是一個字串,表示含有連結的儲存格的位址,比如'A1'。通過該參數指派的ref變數,可能會被openpyxl修改,因此,這裏的ref參數是無關緊要的,如果開發人員自行建立Hyperlink物件的話。- location 參數
location參數是一個字串,表示連結指向的儲存格或範圍的位址,其格式為worksheet!address(比如,SheetB!A1),其中worksheet為工作表名稱,address為位址,如果指向的是本工作表中的儲存格或範圍,則worksheet和!可以省去(比如,A1:B2)。- tooltip 參數
tooltip參數是一個字串,他表示連結對應的工具提示。需要說明的是,即便設定了tooltip,一些 Office 軟體也不會按照tooltip給出的值來顯示工具提示。- display 參數
display參數是一個字串,他表示連結在其對應的儲存格中應該顯示的文字,需要指出,儲存格中最終顯示的內容是由Cell物件的value屬性來決定的。- id 參數
id參數是一個字串,用於識別連結。如果連結對應的target變數不為None,那麽通過參數id指派的id變數,可能會被openpyxl套件在儲存 Excel 檔案時修改,當id變數為None,或者id變數的值不符合要求時。- target 參數
target參數是一個字串,他可能是某個網路位址(比如,以http,https,mailto開頭的位址),或者是某個 Excel 檔案的路徑(可以是相對路徑或絕對路徑)。
在讀取 Excel 檔案時,openpyxl套件會建立連結物件Hyperlink。如果連結並未指向儲存格或範圍,那麽Hyperlink物件的location變數可能為 Python 空值None。如果連結指向儲存格或範圍,那麽Hyperlink物件的id變數可能為 Python 空值None。如果連結指向本工作表中的儲存格或範圍,那麽Hyperlink物件的target變數可能為 Python 空值None。
Hyperlink 物件的變數
Hyperlink物件擁有變數ref,location,tooltip,display,id和target,在未作出修改時,他們的值與傳遞給Hyperlink建構子的引數的值相同。
取得和設定 Excel 連結
Cell物件的hyperlink屬性,可用於取得或設定 Excel 儲存格中的連結。hyperlink屬性的傳回值是一個Hyperlink物件,如果儲存格未包含連結,則Cell物件的hyperlink屬性傳回空值None。
cell.hyperlink
cell.hyperlink = link
- link 值
link是一個表示連結的Hyperlink物件,或者是一個表示連結目標的字串(他將對應Hyperlink物件的target變數),比如'https://www.bing.com/'。要移除儲存格中的連結,link應該為空值None。
Hyperlink 物件的 display 變數可能不會影響 Cell 物件的 value 屬性
當你通過Cell物件的hyperlink屬性來設定連結時,給出的Hyperlink物件的display變數無法影響儲存格的值,即便是空白儲存格,Cell物件也僅會將Hyperlink物件的target或location變數的值設定為儲存格的內容。
在 Excel 檔案Link.xlsx的工作表Hyperlinks中,儲存格A1擁有指向https://www.bing.com/的連結,儲存格A2擁有指向工作表Other的範圍B1:B4的連結。
我們為儲存格B1設定了新的連結,雖然給出了參數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, NoneCell 物件的 hyperlink 屬性僅適用於包含一個連結的儲存格
雖然在一些 Office 軟體中,一個儲存格可以包含多個連結,但Cell物件的hyperlink屬性僅適用於包含一個連結的儲存格,如果儲存格包含多個連結,那麽hyperlink屬性會傳回空值None。
修改 Excel 連結
對於Cell物件的hyperlink屬性所傳回的Hyperlinks物件,你可以通過其變數來達到修改 Excel 連結的目的。
在下面的範例中,我們修改了儲存格A2中的連結,將其指向的儲存格的位址修改為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')當連結所在的儲存格移動時需要修改對應 Hyperlink 物件的 ref 變數
Hyperlink物件的ref變數是含有連結的儲存格的位址,因此,當儲存格移動時,連結對應的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')移除 Excel 連結
你可以通過將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