【问题标题】:Read Excel dynamic file reference using Python使用 Python 读取 Excel 动态文件引用
【发布时间】:2020-06-24 20:59:38
【问题描述】:

我正在尝试使用 Python 读取具有对其单元格的动态工作簿引用的 excel 文件。 当我使用 openpyxl 并阅读它时,它会将具有动态工作簿引用的单元格返回为 '=[1]Sheet0!T10' 而不是:

'='Q:\OPERATIONS\PERFORMANCE\ANALYSIS\2019[analysis.xlsx]Sheet0!T10'

我需要有关正在引用的文件路径的信息。 这是重现该问题的代码:

1: from openpyxl import load_workbook
2: import pandas as pd
3: xls = r"C:\TEST\test.xlsx"
4: wb = load_workbook(filename = xls, read_only=True)
5: ws = wb("sheet1")
6: df = pd.DataFrame(ws.values)
7: ws["E11"].value

这将返回 '=[1]Sheet0!T10'

当我在第 6 行转换为数据框时,它返回 df 值而不是公式,所以这没有帮助。 有没有更好的包或者方法来提取python中引用的文件路径?

【问题讨论】:

  • 您需要查看工作簿中的外部链接。
  • openpyxl 中是否有 Python 方法来查找外部链接?这些文件有 100 个,代码需要查找引用外部文件的任何单元格。

标签: python excel pandas openpyxl


【解决方案1】:

感谢@Charle Clark 提供了找到解决这个难题的线索。此link 提供了在 Excel 文件中获取动态工作簿引用的答案。

for root, dirs, files in os.walk(root, topdown=False):
        for name in files:
            if name.count(".xls"):
                try:
                    xls = os.path.join(root, name)
                    wb = load_workbook(filename = xls, read_only=True)
                    print(xls)
                except Exception as err:
                    msg = "ERROR: {} file failed to read!".format(xls)
                    print(msg)
                    print(err)
                    f.write(str(err)+"\n")
                    continue
                
                items = wb._external_links
                msg = "There are {} external links..".format(len(items))
                print(msg)
                if len(items) > 0:
                    xls_dict[xls] = []
                    for index, item in enumerate(items):                        
                        Mystr = wb._external_links[index].file_link.Target
                        Mystr = Mystr.replace("file:///","").replace("%20"," ")
                        print(Mystr)

此代码可能更简单,但可以完成工作。还有,openpyxl不打开旧版的excel(xls),这个需要单独处理。您可以通过搜索 xlsx 或 release 错误消息进行过滤,如上所示。

【讨论】:

    猜你喜欢
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 2013-06-08
    • 1970-01-01
    • 1970-01-01
    • 2020-12-09
    • 1970-01-01
    相关资源
    最近更新 更多