python excel更新函数计算值,解决读取时不是计算后最新的值

如果你的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()
python excel更新函数计算值,解决读取时不是计算后最新的值_第1张图片
如果我们读取这个单元格,读取到时间会是最新的不会是最新的

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时间跟本地时间有些差距,因为执行顺序和效率有差异)
在这里插入图片描述

总结:如果你有类似的场景,读取一直是一个旧值,那么可以尝试用这个方法。

你可能感兴趣的:(python,excel)