代码之家  ›  专栏  ›  技术社区  ›  Alex F

用python刷新Excel图表外部数据链接

  •  0
  • Alex F  · 技术社区  · 6 年前

    我正在尝试使用python更新Excel中图表的外部数据链接。图表位于 workbook1.xlsm 它引用的更新自身的数据位于 external_workbook.xlsx . 分离的原因是数据必须在 WorkBoo1.xLSM 定期使用python,如果图表在 WorkBoo1.xLSM .

    我看过各种各样的解决方案,但到目前为止还没有一个适合我。到目前为止,我尝试的两种解决方案包括:(1)以编程方式刷新工作簿;(2)在工作簿中运行宏以编程方式刷新工作簿。

    (1)代码:

    import win32com.client as w3c
    xlapp = w3c.gencache.EnsureDispatch('Excel.Application')
    xlapp.Visible = 0
    xlwb = xlapp.Workbooks.Open(r'{}\{}'.format(path, fname), False, True, None)
    xlwb.RefreshAll() # Runs with no errors, but doesn't refresh
    time.sleep(5)
    xlwb.Save()
    xlapp.Quit()
    

    (2)代码:

    # ***************** #
    # Excel macro - I've verified the macro works when I have the worksheet open.
    Sub Update_Links()
        ActiveWorkbook.UpdateLink Name:=ActiveWorkbook.LinkSources
    End Sub
    # ***************** #
    
    import win32com.client as w3c
    xlapp = w3c.gencache.EnsureDispatch('Excel.Application')
    xlapp.Visible = 0
    xlwb = xlapp.Workbooks.Open(r'{}\{}'.format(path, fname), False, True, None)
    xlwb.Application.Run("{}!Module1.Update_Links".format(fname)) # Runs with no errors, but doesn't refresh
    xlwb.Save()
    xlapp.Quit()
    

    Excel中图表的系列是

    # External data link for Excel chart #
    =SERIES(,'...path_to_external_file...[external_workbook.xlsx]Sheet1'!$A$2:$A$2000,
    '...path_to_external_file...[external_workbook.xlsx]Sheet1'!$F$2:$F$2000,1)
    

    有人能为我提供一个替代的解决方案来解决这个问题吗?

    编辑

    所以我尝试了一些更简单的方法来测试这个。我创建了一个名为 temp 在里面 WorkBoo1.xLSM 并尝试使用下面的代码将随机值写入单元格A1。运行代码后,临时表仍为空白。

    import win32com.client as w3c
    import random
    
    xlapp = w3c.gencache.EnsureDispatch('Excel.Application')
    xlapp.Visible = 0
    xlwb = xlapp.Workbooks.Open(r'{}\{}'.format(path, fname), False, True, None)
    books = w3c.Dispatch(xlwb) 
    
    sheet_temp = books.Sheets('temp')
    sheet_temp.Cells(1,1).Value = random.random()
    
    xlwb.RefreshAll() # Runs with no errors, but doesn't refresh
    time.sleep(5)
    xlwb.Save()
    xlapp.Quit()
    

    我在代码上没有发现任何错误,并遵循其他人在网上发布的示例。有人能指点我哪里出了问题吗?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Alex F    6 年前

    答案是我需要打开工作簿 external_workbook.xlsx 在更新之前 workbook1.xlsm ,因此可以刷新数据。

    工作代码如下:

    import win32com.client as w3c
    import random
    
    xlapp = w3c.gencache.EnsureDispatch('Excel.Application')
    xlapp.Visible = 0
    
    # ********************************* #
    # New line that fixes it #
    xlwb_data = xlapp.Workbooks.Open(r'{}\{}'.format(path, 'external_workbook.xlsx'), False, True, None)
    # ********************************* #
    
    xlwb = xlapp.Workbooks.Open(r'{}\{}'.format(path, 'workbook1.xlsm'), False, True, None)
    books = w3c.Dispatch(xlwb) 
    
    sheet_temp = books.Sheets('temp')
    sheet_temp.Cells(1,1).Value = random.random()
    
    xlwb.RefreshAll() # Runs with no errors, but doesn't refresh
    time.sleep(5)
    xlwb.Save()
    xlapp.Quit()