Python与Excel交互:向蒸汽表传入数据并获取过热焓值
解决Excel蒸汽表写入数据后未触发双插值计算的问题
问题根源
你用openpyxl遇到的问题本质是:openpyxl仅操作Excel文件的底层结构,不会调用Excel的计算引擎。加上初始化时用了data_only=True,读取的是单元格里已有的静态值,而非公式动态计算后的结果。即便写入新数据并保存,Excel公式也不会自动重新计算,自然拿不到更新后的焓值。
解决方案
改用xlwings库,它会直接启动本地Excel实例,完全复用Excel的原生计算能力,能确保写入数据后触发公式重算,获取最新结果。
修复后的完整代码
import xlwings as xw import os def process_excel_files(input_file, process_file, output_file, data_sheet_name, process_sheet_name, result_sheet_name, input_columns, result_column, start_row=1): # 启动后台Excel实例,关闭弹窗和屏幕更新提升效率 with xw.App(visible=False) as app: app.display_alerts = False app.screen_updating = False # 加载工作簿 input_wb = app.books.open(input_file) process_wb = app.books.open(process_file) output_wb = app.books.open(output_file) # 选择工作表 data_sheet = input_wb.sheets[data_sheet_name] process_sheet = process_wb.sheets[process_sheet_name] result_sheet = output_wb.sheets[result_sheet_name] # 遍历输入数据的每一行 for row in range(start_row, data_sheet.range('A1').end('down').row + 1): # 读取压力和温度数据 PressurePSI = data_sheet.range((row, input_columns[0])).value # PSI单位压力 TemperatureF = data_sheet.range((row, input_columns[1])).value # 华氏度单位温度 # 将数据写入蒸汽表指定单元格 process_sheet.range('C8').value = PressurePSI process_sheet.range('D8').value = TemperatureF # 保存并关闭后重新打开,强制触发Excel计算(也可直接调用app.calculate()替代此步骤) process_wb.save() process_wb.close() process_wb = app.books.open(process_file) process_sheet = process_wb.sheets[process_sheet_name] # 获取计算后的焓值 result_value = process_sheet.range('G8').value # 焓值位于G8单元格 # 将结果写入输出文件 result_sheet.range((row, result_column)).value = result_value # 保存并关闭所有工作簿 input_wb.save() output_wb.save() input_wb.close() process_wb.close() output_wb.close() # 使用示例 input_file = 'TempPressVals.xlsx' process_file = 'Steam_Tables.xlsx' output_file = 'EnthalpyValues.xlsx' data_sheet_name = 'Sheet1' process_sheet_name = 'Sheet1' result_sheet_name = 'Sheet1' input_columns = [1, 2] # 读取A、B列数据 result_column = 2 # 结果写入C列 process_excel_files(input_file, process_file, output_file, data_sheet_name, process_sheet_name, result_sheet_name, input_columns, result_column)
额外优化建议
如果不想通过关闭重开工作簿触发计算,可替换对应代码块为直接调用Excel的计算指令,效率更高:
# 替代保存关闭重开的代码 app.calculate() result_value = process_sheet.range('G8').value
内容的提问来源于stack exchange,提问作者ChemEGrant
相关产品推荐
相关产品推荐

