我使用的是Python 2.7,大部分的Excel数据解析都是依靠Pandas完成的。

1 个评论
你的问题是什么?我只能猜测是 "你能不能从python中刷新数据连接",但你的帖子中没有这个问题。
python
excel
pandas
mk8efz
mk8efz
发布于 2016-12-01
6 个回答
Chris J
Chris J
发布于 2022-03-12
已采纳
0 人赞同

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

xlapp = win32com.client.DispatchEx("Excel.Application")
wb = xlapp.Workbooks.Open(<path_to_excel_workbook>)
wb.RefreshAll()
xlapp.CalculateUntilAsyncQueriesDone()
wb.Save()
xlapp.Quit()
    
你能帮我提供适用于Mac的代码吗?
Julien Marrec
Julien Marrec
发布于 2022-03-12
0 人赞同

如果你是在windows系统上,我相信你的截图是这样的,你可以使用 win32com 模块。它将允许你--从python中--打开Excel,加载一个工作簿,刷新所有数据连接,然后退出。语法最终与VBA相当接近。

我建议你通过管道安装 pypiwin32 pip install 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()
    
谢谢你的建议--我之前尝试过这种方法,但不幸的是,我收到一个 "这将取消一个待定的数据刷新。继续吗?"的对话框,什么也没有发生。
你是否尝试过从excel完成数据刷新,然后重新启动你的电脑?这应该能起作用
cco
试着在调用 xlapp.Quit() 之前先睡一会儿。 多长时间取决于刷新需要运行多长时间。
Tom
@cco,这正是我遇到的问题。time.sleep(5)防止了这个错误。人们期望它在继续前进之前完成刷新。
cco
在内部,Excel可以在多个处理器上使用多个线程。 如果你有一个复杂的电子表格,它甚至会在重新计算时显示使用的处理器数量。我记得,单个数据库连接可以同步刷新,但我认为(似乎)`RefreshAll()'是异步运行的,所以API调用会在刷新完成前返回。 如果电子表格只用于输入,你可以考虑从Python中运行查询,因为它可以与Excel的任何数据库对话。
ratherstrange
ratherstrange
发布于 2022-03-12
0 人赞同

由于这是谷歌的第一个链接,所以将此作为一个答案加入--第一个答案中的代码起了作用,但有错误的大写字母,应该是。

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()
    
你真的需要等待5秒吗?替换代码0】是在刷新真正完成之前返回吗?
Xaviour
Xaviour
发布于 2022-03-12
0 人赞同

在其他人所说的基础上,当代码到了 "退出 "一行时,我又一直得到保存对话框。我把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()
    
Andrei Harin
Andrei Harin
发布于 2022-03-12
0 人赞同

一个小提示,但很重要。上面所有的代码都是正确的,但它会引起权限Err 13的问题,因为文件只是被保存,而不是同时关闭。

增加 wb.Close() 保存后,否则打开的Excel将保持在后台应用程序中,如果你有500个这样的应用程序,你可能会遇到一些麻烦。

henry434
henry434
发布于 2022-03-12
0 人赞同

添加另一个稍有变化的答案,因为我被这个问题困住了,没有一个解决方案是有效的。对我有用的是启用 Xlsx.DisplayAlerts = True Xlsx.Visible = True ,然后在最后用 book.Save() 保存书,同时用保存关闭。 book.Close(SaveChanges=True)

每次打开和关闭Excel有点麻烦(我在许多excel文件中迭代),但它可以工作,所以很好。

import win32com.client as win32
import pythoncom
def open_close_as_excel(file_path):
        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)