【问题标题】:Using Python's Openpyxl for an index match使用 Python 的 Openpyxl 进行索引匹配
【发布时间】:2020-02-03 14:58:17
【问题描述】:

我正在尝试构建一个工具,该工具将在电子表格的单元格中运行索引匹配,然后在 python 中显示公式的结果。我的理解是 Openpyxl 实际上不会运行公式,但我可以写入 excel 然后刷新文件来运行它?

from openpyxl import load_workbook
path= "C:\\Users\\Me\\Documents\\Python\\File.xlsx"
myworkbook=load_workbook(path)
worksheet=myworkbook.get_sheet_by_name('Sheet1')
mycell=worksheet['B2']
mycell.value="index(B4:B72,match(B1,A4:A72,0))"
print(mycell)

无论如何,我收到并出错,我不确定发生了什么。输出:

DeprecationWarning:调用已弃用的函数 get_sheet_by_name(使用 wb[sheetname])。 工作表=myworkbook.get_sheet_by_name('Sheet1')

进程以退出代码 0 结束

需要明确的是,如果我只是在 Excel 中执行该公式,则该公式有效,因为 B1 已填充到文件中。

我不确定输出在做什么。它没有抛出错误,但我不知道<Cell 'Sheet1'.B2> 和“进程以退出代码 0 完成”试图告诉我什么。我期望一个字符串输出,因为我试图在一个句子中索引。

【问题讨论】:

    标签: python excel automation pycharm openpyxl


    【解决方案1】:

    A) 运行公式需要在 Excel 中打开文件。正如您所说:

    我的理解是Openpyxl实际上不会运行公式,但我可以写入excel然后刷新文件以运行它?

    如果“刷新文件以运行它”是指在 Excel 中打开文件,那么是的,Excel 将执行公式。

    B) 你得到的错误实际上只是一个警告,告诉你你使用的功能在 Openpyxl 的未来版本中将不可用。在这种情况下,警告还会告诉您访问工作表的正确方法。

    调用已弃用的函数 get_sheet_by_name (使用 wb[sheetname]) [强调添加]

    为避免出现警告,请将该行替换为:

    worksheet=myworkbook['Sheet1']
    

    C) 当您使用 Openpyxl 向单元格添加公式时,您必须在公式的开头包含 = 字符,因此您的行应该是:

    mycell.value="=index(B4:B72,match(B1,A4:A72,0))"
    

    D) 在您的 print 语句中,您将 mycell 对象传递给它,这就是它打印对象 <Cell 'Sheet1'.B2> 的“名称”的原因。如果您想验证您的 mycell 变量是否指向工作簿中的正确单元格,这可能很有用,但这不是您想要的。要访问单元格的内容,您需要引用该单元格的.value。将您的打印语句修改为:

    print(mycell.value)
    

    将所有这些放在一起:

    from openpyxl import load_workbook
    path= "C:\\Users\\Me\\Documents\\Python\\File.xlsx"
    myworkbook=load_workbook(path)
    worksheet=myworkbook['Sheet1']
    mycell=worksheet['B2']
    mycell.value="=index(B4:B72,match(B1,A4:A72,0))"
    print(mycell.value)
    

    【讨论】:

    • 谢谢,我会试试这个。然后我会添加 openpyxl 命令 myworkbook.RefreshAll ,然后添加您编写的打印命令,它会正确显示吗?
    • Openpyxl 中没有.RefreshAll() 方法。最接近的是.RefreshAllConnections,这是一个用于告诉 Excel 在打开工作表时刷新连接的参数。为了做您想做的事,您需要使用win32com 在 Excel 中打开和刷新工作簿,如以下回答中所述:stackoverflow.com/questions/40893870/…
    • stackoverflow.com/questions/58359177/… 嗨,克雷格,因为在我想 ping 你之前,你是一个令人难以置信的帮助。在听取了您的建议后,我发布了一个新问题。如果您有空闲时间能插话,我将不胜感激。
    猜你喜欢
    • 2021-10-29
    • 1970-01-01
    • 2012-03-23
    • 1970-01-01
    • 1970-01-01
    • 2021-04-04
    • 2015-06-02
    • 1970-01-01
    • 2021-01-07
    相关资源
    最近更新 更多