从一张excel中将数据复制到另一张excel中对应列出错了
来源:2-2 文件的复制
星辰奕奕
2025-04-03 21:00:51
import xlwings as xw
from typing import Dict
from openpyxl import load_workbook
def get_merged_column_names(target_path: str, target_sheet: str, header_row: int = 4) -> list:
wb = load_workbook(target_path, read_only=False)
ws = wb[target_sheet]
headers = []
seen_headers = set()
for idx, cell in enumerate(ws[header_row]):
header_value = ""
merged = False
# 检查合并区域
for merged_range in ws.merged_cells.ranges:
if cell.coordinate in merged_range:
start_cell = merged_range.start_cell
header_value = str(start_cell.value).strip() if start_cell.value else ""
merged = True
break
# 非合并单元格处理
if not merged:
header_value = str(cell.value).strip() if cell.value else ""
# 跳过空列名
if not header_value:
headers.append(None)
continue
# 处理重复列名
if header_value in seen_headers:
header_value = f"{header_value}_{idx}"
seen_headers.add(header_value)
headers.append(header_value)
wb.close()
return headers
def copy_columns_by_name(
source_path: str,
source_sheet: str,
target_path: str,
target_sheet: str,
column_map: Dict[str, str], # 格式: {"源列名": "目标列名"}
):
"""
将源表指定列数据复制到目标表同名列,保持目标列格式不变
"""
# 启动 WPS 进程
app = xw.App(visible=False) # 若需要调试可改为 visible=True
source_wb = None # 初始化变量
target_wb = None # 初始化变量
try:
# 打开源文件和目标文件
source_wb = app.books.open(source_path)
target_wb = app.books.open(target_path)
# 定位工作表
source_ws = source_wb.sheets[source_sheet]
target_ws = target_wb.sheets[target_sheet]
# # 获取目标表的列名与索引映射
# target_headers = target_ws.range("A4").expand("right").value
# target_col_indices = {
# str(header).strip(): idx + 1 # 索引从1开始
# for idx, header in enumerate(target_headers)
# }
# 获取目标表的列名(通过 openpyxl 处理合并单元格)
target_headers = get_merged_column_names(target_path, target_sheet, header_row=4)
target_col_indices = {
header: idx + 1
for idx, header in enumerate(target_headers)
if header and str(header).strip() != "None" # 过滤空值或"None"
}
# 在获取 target_col_indices 后添加
print("目标列名与索引:", target_col_indices)
# 验证目标列是否存在
missing_columns = [
target_col
for target_col in column_map.values()
if target_col not in target_col_indices
]
if missing_columns:
raise ValueError(f"目标表中缺失以下列: {missing_columns}")
# 遍历源表数据并复制
source_headers = source_ws.range("A1").expand("right").value
max_row = source_ws.range("A1").expand("down").last_cell.row
for src_col_name, tgt_col_name in column_map.items():
# 获取源列索引
src_col_idx = source_headers.index(src_col_name) + 1
# 获取目标列索引
tgt_col_idx = target_col_indices[tgt_col_name]
# print(f"目标列名: {tgt_col_name}, 目标列索引: {tgt_col_idx}") # 调试
print(f"正在复制列:'{src_col_name}'(索引 {src_col_idx}) → 目标列 '{tgt_col_name}'(索引 {tgt_col_idx})")
# 批量复制数据(保留目标格式)
source_data = source_ws.range(
(2, src_col_idx), (max_row, src_col_idx)
).value
target_ws.range(
(5, tgt_col_idx), (max_row, tgt_col_idx)
).value = source_data
target_wb.save()
print("数据复制完成,目标格式已保留!")
except Exception as e:
print(f"错误: {str(e)}")
finally:
if source_wb:
source_wb.close()
if target_wb:
target_wb.close()
app.quit()
# 示例调用(直接使用列名映射)
if __name__ == "__main__":
column_maping = {
"采样时间": "Date and time", # 示例:映射到目标文件不存在的列时自动创建
"comp": "Comp shell", "suction": "Suction", "discharge": "discharge", "filter": "filter",
"con_in": "Cond In", "con_middle": "Cond middle", "con_out": "Cond Out",
"eva_in": "Eva In", "eva_out": "Eva Out",
# "6-1": "6-1", "6-2": "6-2", "6-3": "6-3", "6-4": "6-4",
# "5-1": "5-1", "5-2": "5-2", "5-3": "5-3", "5-4": "5-4",
# "4-1": "4-1", "4-2": "4-2", "4-3": "4-3", "4-4": "4-4",
"3-1": "3-1", "3-2": "3-2", "3-3": "3-3", "3-4": "3-4", # 示例:多源列映射到同一目标列
"2-1": "2-1", "2-2": "2-2", "2-3": "2-3", "2-4": "2-4",
"1-1": "1-1", "1-2": "1-2", "1-3": "1-3", "1-4": "1-4",
"V": "V", "A": "A", "W": "W", "KWh": "kWh", "PF": "PF", "Hz": "VHz",
"DB": "DB(℃)", "RH_Adjusted": "RH(%)"
}
copy_columns_by_name(
source_path=r"C:\Users\37747\Desktop\Cleaned_BR375K1能耗Active241017.xlsx",
source_sheet="Sheet1",
target_path=r"C:\Users\37747\Desktop\SKG BR375 K4 Energy comsuption test report.xlsx",
target_sheet="DATA(Active)",
column_map=column_maping
)问题描述:
为什么运行这段代码,没有被正确写入到目标列,而是写入到了A5所在行?索引号对应好像没问题啊,复制写入那段好像也没问题啊!怎么回事?
相关截图:


1回答
好帮手慕小猿
2025-04-07
同学,你好!非课程中的作业或者练习,不在服务之内。同学可以找找其它平台或者资源解决下问题。
祝学习愉快~
相似问题