如果你的excel中有些数据,需要进去后才更新(例如TODAY()函数等),而读取并不能更新那些值,那么可以尝试这个方法
from win32com.client import Dispatch
file_path = r'E:\PyProject\test\test.xls'
# os.system('taskkill /IM EXCEL.exe /F') # 关闭excel进程,慎用
xlapp = Dispatch('Excel.Application')
xlapp.visible = False # 是否显示excel窗口
wkb = xlapp.Workbooks.open(file_path)
wkb.RefreshAll()
# time.sleep(3) # 更新的内容过多时,可以适当加等待时间
wkb.Save()
wkb.Close()
xlapp.quit()
实例:
我们模拟一个会变化excel时间函数:now()
如果我们读取这个单元格,读取到时间会是最新的不会是最新的
from win32com.client import Dispatch
from datetime import datetime
from xlrd import xldate_as_tuple
import xlrd
def update_excel(filepath):
# os.system('taskkill /IM EXCEL.exe /F')
xlapp = Dispatch('Excel.Application')
xlapp.visible = False
wkb = xlapp.Workbooks.open(filepath)
wkb.RefreshAll()
# time.sleep(5)
wkb.Save()
wkb.Close()
xlapp.quit()
if __name__ == '__main__':
file_path = r'E:\PyProject\Test_Pratice\test_excel.xls'
localtime = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
# update_excel(file_path) # 不执行更新
wb = xlrd.open_workbook(file_path, formatting_info=True)
sheet = wb.sheet_by_name(sheet_name='sheet1')
cell_value = sheet.cell_value(rowx=0, colx=0)
excel_time = datetime(*xldate_as_tuple(cell_value, 0))
print('excel时间:'+excel_time.strftime('%Y-%m-%d %H:%M:%S')+'\n本地时间:'+localtime)
运行结果:这里可以看出来,excel的时间还是最初的时间,并没有变化
如果我们执行更新操作的话:
if __name__ == '__main__':
file_path = r'E:\PyProject\Test_Pratice\test_excel.xls'
localtime = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
update_excel(file_path) # 执行更新操作
wb = xlrd.open_workbook(file_path, formatting_info=True)
sheet = wb.sheet_by_name(sheet_name='sheet1')
cell_value = sheet.cell_value(rowx=0, colx=0)
excel_time = datetime(*xldate_as_tuple(cell_value, 0))
print('excel时间:'+excel_time.strftime('%Y-%m-%d %H:%M:%S')+'\n本地时间:'+localtime)
运行结果:NOW()函数的时间是更新了的(这里excel时间跟本地时间有些差距,因为执行顺序和效率有差异)
总结:如果你有类似的场景,读取一直是一个旧值,那么可以尝试用这个方法。