使用openpyxl识别外部工作簿链接

时间:2015-12-04 19:49:22

标签: 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

但是,当我将具有外部值的单元格值打印到控制台时,会产生以下结果:

=[1]Sheet1!$B$4
=[2]Sheet1!$B$4

因此,openpyxl显然不会以我想象的方式解析包含外部值的公式,并且由于方括号用于表公式,因此尝试以这种方式获取外部链接是没有意义的。

我深入挖掘并在openpyxl.workbook.names.external模块(reference)中找到了detect_external_links函数。我不知道是否可以实际调用此函数来执行我想要的操作。

从控制台结果看起来似乎openpyxl了解有引用,并且似乎在排序列表中包含它们。但是可以访问此列表吗?或者检测这样的列表是否存在?

无论哪种方式 - 我只需要弄清楚一个单元格是否包含指向外部工作簿的链接。

3 个答案:

答案 0 :(得分:3)

我决定在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')

获得XML文件后,我可以使用ElementTree运行XML树,继续识别单元格地址,值和其他信息。

答案 1 :(得分:3)

我找到了解决方案。 使用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     

答案 2 :(得分:0)

无法在openpyxl中执行您想要的操作。您可以自由地尝试使用该库来处理文件存档,但这需要与文件格式规范密切配合。