你好,我刚开始学习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()
?也许通过使用循环或类似的解决方案?
我也会这么做。
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()
您希望创建一个可重用的函数,该函数接受一个文件路径和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:
refresh_excel(Xlsx, file)
Xlsx.Quit()
你从创建一个函数中得到的唯一真正的好处,由def
关键字表示是如果你的脚本增长,变得更复杂,做更多的事情,它有助于保持事情有组织,而不是不得不尝试和调试100行代码。