如何用Python读取电容Excel数据并覆盖目标Excel指定列内容?
问题与解决方案
需求概述
- 读取电容工作簿数据,覆盖第二个Excel工作簿的指定列
- 第二个工作簿按唯一设备ID列示电容,需通过CAP ID从电容数据库(仅按CAP ID存储)查询对应数据
- 需提取内容:第4列的Controller Name,以及对应ON/OFF状态值(电流控制对应“ON”“OFF”,温度控制对应“TEMP ON”“TEMP OFF”)
- 功能要求:弹窗输入CAP ID,自动查询后覆盖第二个工作簿的指定列:
- MODULE1CAPSWITCHCLOSEVALUE:对应ON状态值
- MODULE1CAPSWITCHTRIPVALUE:对应OFF状态值
- PRIMARYCONTROLMODE:电流控制填“VOLTS”,温度控制填“TEMP”
- 疑问:是否需要为第二个工作簿新建DataFrame来覆盖数据?现有代码无法实现预期功能,求指导
现有代码问题分析
现有代码存在多个关键问题:
new_data未初始化就调用append,会触发NameError- 初始化
new_df时使用未定义的data变量,代码直接报错 - 对源数据的状态判断逻辑错误(错误将列名当作状态值判断,比如
row['ON'] == "ON") - 未加载第二个工作簿的原有数据,直接新建DataFrame覆盖会丢失原有内容
- 未将处理后的数据映射到目标工作簿的指定列
正确实现思路
不需要新建DataFrame覆盖,应加载目标工作簿的现有DataFrame,找到对应CAP ID的行,直接更新指定列的值,步骤如下:
- 加载源数据(电容工作簿)和目标数据(第二个工作簿)
- 根据输入的CAP ID筛选源数据中的相关行
- 提取控制模式、ON/OFF状态对应的值
- 在目标DataFrame中定位匹配CAP ID的行(需确认目标工作簿中关联CAP ID的列名)
- 更新目标DataFrame的指定列
- 保存更新后的目标工作簿
修正后的代码
import pandas as pd # 输入CAP ID cap_id = input("Enter the CAP ID number: ") # 1. 加载源数据和目标数据 source_path = r'C:\Users\x9006\Documents\SWCAPS.xlsx' target_path = 'Synergi Settings.xlsx' source_df = pd.read_excel(source_path) target_df = pd.read_excel(target_path) # 2. 筛选当前CAP ID的所有行 cap_data = source_df[source_df['ID'] == cap_id] if cap_data.empty: print(f"未找到CAP ID为{cap_id}的数据") exit() # 3. 提取控制模式和状态值 control_mode = None on_value = None off_value = None for _, row in cap_data.iterrows(): controller_name = row['CONTROLLER_NAME'] # 确定控制模式 if controller_name == "CURRENT": control_mode = "VOLTS" elif controller_name == "TEMPERATURE": control_mode = "TEMP" # 提取ON/OFF对应的值(需根据源数据实际列名调整'SETTING_CODE') setting_code = row['SETTING_CODE'] value = row['VALUE_NUM'] if setting_code in ["ON", "TEMP ON"]: on_value = value elif setting_code in ["OFF", "TEMP OFF"]: off_value = value # 4. 更新目标工作簿的指定列(需根据目标数据实际列名调整匹配列'CAP ID') target_mask = target_df['CAP ID'] == cap_id if target_mask.any(): target_df.loc[target_mask, 'MODULE1CAPSWITCHCLOSEVALUE'] = on_value target_df.loc[target_mask, 'MODULE1CAPSWITCHTRIPVALUE'] = off_value target_df.loc[target_mask, 'PRIMARYCONTROLMODE'] = control_mode # 保存更新后的目标工作簿 target_df.to_excel(target_path, index=False) print(f"已成功更新CAP ID为{cap_id}的数据到目标工作簿") else: print(f"目标工作簿中未找到CAP ID为{cap_id}的记录")
关键说明
- 需根据实际Excel文件的列名,调整代码中对应的列名(比如源数据中存储状态的列名、目标工作簿中匹配CAP ID的列名)
- 直接在原有目标DataFrame上更新行数据,可保留其他原有内容
- 增加了空数据判断,避免因找不到CAP ID导致的报错
内容的提问来源于stack exchange,提问作者Shy
相关产品推荐
相关产品推荐

