刷新不同文件路径的多个Excel文件 - 使用Python

0 人关注

你好,我刚刚开始学习Python/编程,有以下问题。

我想用python刷新几个excel文件。但是,所有这些excel文件的文件路径完全不同,所以它们并不都存储在一个文件夹中。

使用 pypiwin32 写一个刷新一个excel文件的代码是没有问题的。要刷新几个不同文件路径的excel文件,目前我是这样解决的。

import win32com.client as win32
Xlsx = win32.DispatchEx('Excel.Application')
Xlsx.DisplayAlerts = False
Xlsx.Visible = False
book1 = Xlsx.Workbooks.Open('<path_to_excel_workbook1>')
book2 = Xlsx.Workbooks.Open('<path_to_excel_workbook2>')
book1.RefreshAll()
book2.RefreshAll()
Xlsx.CalculateUntilAsyncQueriesDone()
book1.Save()
book2.Save()
book1.Close(SaveChanges=True)
book2.Close(SaveChanges=True)
Xlsx.Quit()
del book1
del book2
del Xlsx

然而,当有50个或更多的Excel文件需要更新时,整个代码会变得不必要的冗长。 有没有一种方法可以遍历所有的Excel文件,而不用为每个Excel文件写一行代码来执行RefreshAll()Save()Close()? 也许通过使用一个循环或类似的解决方案?

python
excel
pywin32
Fossil74
Fossil74
发布于 2022-07-18
2 个回答
Weldis
Weldis
发布于 2022-07-18
已采纳
0 人赞同

我也会做这样的事情。

import win32com.client as win32
file_paths = ['path_one', 'path_two']
Xlsx = win32.DispatchEx('Excel.Application')
Xlsx.DisplayAlerts = False
Xlsx.Visible = False
for path in file_paths:
    book = Xlsx.Workbooks.Open(path)
    book.RefreshAll()
    Xlsx.CalculateUntilAsyncQueriesDone()
    book.Close(SaveChanges=True)
Xlsx.Quit()
    
正如@el_oso所说,你可以从循环中提取代码到函数中,以便在其他地方使用这段代码
el_oso
el_oso
发布于 2022-07-18
0 人赞同

你想做一个可重复使用的函数,接收一个文件路径和Xlsx对象。然后你可以在一个列表中的所有路径上做一个简单的循环

def refresh_excel(Xlsx, filepath):
    #everything under this indented code block is run every time you call refresh_excel
    workbook = Xlsx.Workbooks.Open(filepath)
    workbook.RefreshAll()
    workbook.CalculateUntilAsyncQueriesDone()
    workbook.Save()
    workbook.Close() #this might not be needed
    return True
#this unindented block sets up you Excel application and stores your list of excel filepaths you want to refresh
Xlsx = win32.DispatchEx('Excel.Application')
Xlsx.DisplayAlerts = False
Xlsx.Visible = False
file_list = ['path1.xlsx', 'path2.xlsx', 'path3.xlsx']
#create a loop that runs refresh_excel function, using every filename in your list. 
#The Xlsx parameter ensures that you use the same Excel application, 
#which would help speed up your script by not needlessly opening and 
#closing a new Excel application for every file.
for file in file_list: