You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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来覆盖数据?现有代码无法实现预期功能,求指导

现有代码问题分析

现有代码存在多个关键问题:

  1. new_data未初始化就调用append,会触发NameError
  2. 初始化new_df时使用未定义的data变量,代码直接报错
  3. 对源数据的状态判断逻辑错误(错误将列名当作状态值判断,比如row['ON'] == "ON")
  4. 未加载第二个工作簿的原有数据,直接新建DataFrame覆盖会丢失原有内容
  5. 未将处理后的数据映射到目标工作簿的指定列

正确实现思路

不需要新建DataFrame覆盖,应加载目标工作簿的现有DataFrame,找到对应CAP ID的行,直接更新指定列的值,步骤如下:

  1. 加载源数据(电容工作簿)和目标数据(第二个工作簿)
  2. 根据输入的CAP ID筛选源数据中的相关行
  3. 提取控制模式、ON/OFF状态对应的值
  4. 在目标DataFrame中定位匹配CAP ID的行(需确认目标工作簿中关联CAP ID的列名)
  5. 更新目标DataFrame的指定列
  6. 保存更新后的目标工作簿

修正后的代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 08:08:12