pandas 用Python刷新Excel外部数据

w9apscun  于 2023-05-15  发布在  Python
关注(0)|答案(7)|浏览(267)

我有一个Excel文件,我运行一个Python脚本。Excel文件具有外部数据连接,需要在运行Python脚本之前刷新这些连接。我所指的功能在这里:

我使用的是Python 2.7,并依赖Pandas进行大部分Excel数据解析。

f1tvaqid

f1tvaqid1#

CalculateUntilAsyncQueriesDone()将保存程序并等待刷新完成。

xlapp = win32com.client.DispatchEx("Excel.Application")
wb = xlapp.Workbooks.Open(<path_to_excel_workbook>)
wb.RefreshAll()
xlapp.CalculateUntilAsyncQueriesDone()
wb.Save()
xlapp.Quit()
fruv7luv

fruv7luv2#

如果你使用的是windows系统,我相信你已经看到了截图,你可以使用win32com模块。它将允许你-从Python -打开Excel,加载工作簿,刷新所有数据连接,然后退出。语法最终非常接近VBA。
我建议你通过pip(pip install pypiwin32)安装pypiwin32

import win32com.client

# Start an instance of Excel
xlapp = win32com.client.DispatchEx("Excel.Application")

# Open the workbook in said instance of Excel
wb = xlapp.workbooks.open(<path_to_excel_workbook>)

# Optional, e.g. if you want to debug
# xlapp.Visible = True

# Refresh all data connections.
wb.RefreshAll()
wb.Save()

# Quit
xlapp.Quit()
fdx2calv

fdx2calv3#

添加此作为答案,因为这是第一个Google链接-第一个答案中的代码工作,但大写不正确,它应该是:

import win32com.client
import time

xlapp = win32com.client.DispatchEx("Excel.Application")
wb = xlapp.Workbooks.Open(<path_to_excel_workbook>)
wb.RefreshAll()
time.sleep(5)
wb.Save()
xlapp.Quit()
rks48beu

rks48beu4#

一个小纸条,但很重要。上面的所有代码都是正确的,但它会引起权限Err 13的问题,因为文件只被保存,而不是关闭。
在保存后添加wb.Close(),否则打开的Excel将保留在后台应用程序中,如果您使用其中的500个,您可能会遇到一些麻烦

u3r8eeie

u3r8eeie5#

在其他人所说的基础上,当代码到达Quit行时,我再次看到保存对话框。我将DisplayAlerts标志设置为false,它解决了我的问题。我也不需要睡眠计时器。这就是我的工作:

xlapp = win32com.client.DispatchEx("Excel.Application")
wb = xlapp.Workbooks.Open(<path_to_excel_workbook>)
wb.RefreshAll()
xlapp.CalculateUntilAsyncQueriesDone()
xlapp.DisplayAlerts = False
wb.Save()
xlapp.Quit()
7gs2gvoe

7gs2gvoe6#

添加另一个略有变化的答案,因为我被这个难住了,没有一个解决方案是工作。对我有用的是启用Xlsx.DisplayAlerts = TrueXlsx.Visible = True,然后最后用book.Save()保存这本书,并用保存关闭:book.Close(SaveChanges=True)
每次打开和关闭Excel都有点麻烦(我正在迭代许多Excel文件),但它工作得很好。

import win32com.client as win32
import pythoncom

def open_close_as_excel(file_path):
    try:
        pythoncom.CoInitialize()
        Xlsx = win32.DispatchEx('Excel.Application')
        Xlsx.DisplayAlerts = True
        Xlsx.Visible = True
        book = Xlsx.Workbooks.Open(file_path)
        book.RefreshAll()
        Xlsx.CalculateUntilAsyncQueriesDone()
        book.Save()
        book.Close(SaveChanges=True)
        Xlsx.Quit()
        pythoncom.CoUninitialize()

        book = None
        Xlsx = None
        del book
        del Xlsx
        print("-- Opened/Closed as Excel --")

    except Exception as e:
        print(e)

    finally:
        # RELEASES RESOURCES
        book = None
        Xlsx = None
nhhxz33t

nhhxz33t7#

根据我在尝试现有解决方案时遇到的各种错误,我重新发布了一个更完整的答案:

# Open an Instance of Application
xlapp = win32com.client.DispatchEx("Excel.Application") 

# Open File
Workbook = xlapp.Workbooks.Open(<path+file name>) 

# Refresh all  
Workbook.RefreshAll()

# Wait until Refresh is complete
xlapp.CalculateUntilAsyncQueriesDone()

# Save File  
Workbook.Save()

# Quit Instance of Application
xlapp.Quit() 

#Delete Instance of Application
del xlapp

相关问题