art*_*dge 4 python excel openpyxl
我正在尝试使用 Python 3.4 中的 openpyxl 来识别包含外部工作簿引用的所有单元格。但我失败了。我的第一次尝试包括:
def find_external_value(cell):
# identifies an external link in a given cell
if '.xls' in cell.value:
has_external_reference = True
return has_external_value
Run Code Online (Sandbox Code Playgroud)
但是,当我将具有外部值的单元格值打印到控制台时,它会产生以下结果:
=[1]Sheet1!$B$4
=[2]Sheet1!$B$4
Run Code Online (Sandbox Code Playgroud)
因此,openpyxl 显然不会以我想象的方式解析包含外部值的公式,并且由于方括号用于表格公式,因此尝试以这种方式获取外部链接是没有意义的。
我挖得更深一些,在 openpyxl.workbook.names.external 模块(参考)中找到了 detect_external_links 函数。我不知道是否真的可以调用这个函数来做我想做的事。
从控制台结果看来,openpyxl 似乎知道存在引用,并且似乎将它们包含在一系列列表中。但是可以访问此列表吗?或者检测是否存在这样的列表?
无论哪种方式 - 我只需要弄清楚单元格是否包含指向外部工作簿的链接。
我已经找到了解决方案。使用 openpyxl 库将 xlsx 文件加载为
import openpyxl
wb=openpyxl.load_workbook("Myworkbook.xlsx")
"""len(wb._external_links) *Add this line to get count of linked workbooks*"""
items=wb._external_links
for index, item in enumerate(items):
Mystr =wb._external_links[index].file_link.Target
Mystr=Mystr.replace("file:///","")
print(Mystr.replace("%20"," "))
----------------------------
Out[01]: ##Indicates that the workbook has 4 external workbook links##
/Users/myohannan/AppData/Local/Temp/49/orion/Extension Workpapers_Learning Extension Calc W_83180610.xlsx
/Users/lmmeyer/AppData/Local/Temp/orion/Complete Set of Workpapers_PPS Workpapers 123112_111698213.xlsx
\\SF-DATA-2\IBData\TEMP\ie5\Temporary Internet Files\OLK8A\LBO Models\PIGLET Current.xls
/WINNT/Temporary Internet Files/OLK3/WINDOWS/Temporary Internet Files/OLK8304/DEZ.XLS
Run Code Online (Sandbox Code Playgroud)
为了实现我的目标,我决定转向 openpyxl 之外 - 尽管 openpyxl 有许多引用外部链接的函数,但我无法找到一种简单的方法来实现我的目标。
相反,我决定使用ZipFile打开内存中的工作簿,然后搜索 externalLink1.xml 文件。如果存在,则工作簿包含外部链接:
import tkinter as tk
from tkinter import filedialog
from zipfile import ZipFile
Import xml.etree.ElementTree
root = tk.Tk()
root.withdraw()
file_path = filedialog.askopenfilename()
with ZipFile(file_path) as myzip:
try:
my_file = myzip.open('xl/externalLinks/externalLink1.xml')
e = xml.etree.ElementTree.parse(my_file).getroot()
print('Has external references')
except:
print('No external references')
Run Code Online (Sandbox Code Playgroud)
获得 XML 文件后,我可以使用ElementTree运行 XML 树来继续识别单元格地址、值和其他信息。