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

Python多Excel文件指定列复制问题:重复覆盖而非分别写入

Python Excel合并脚本问题:所有目标列被最后一个文件数据覆盖

我需要编写Python脚本,遍历文件夹中的Excel文件,将每个文件内容复制到同一个工作簿的指定列(A、D、G列,间隔3列),测试用3个源文件。但运行后所有指定列都被最后一个文件的数据覆盖——预期A列存文件1、D列存文件2、G列存文件3,实际全是文件3的数据。

原代码

import os
import openpyxl
from openpyxl import Workbook, load_workbook
import string     

for file in os.listdir(file_path):
    if file.endswith('.xlsx'):
        print(f'Loading file {file}...')
        wb = load_workbook(file_path+file)
        ws = wb.worksheets[0]
        wb1 = load_workbook(new_path+'data.xlsx')
        ws1 = wb1.active
        #calculate max rows and columns in source dataset
        mr = ws.max_row
        mc = ws.max_column
        m = [0,3,6]
        #copying data to new sheet
        for i in range(1,mr+1):
            for j in range(1,mc+1):
                for y in range(0,3):
                    #reading cell value from source
                    c = ws.cell(row = i, column = j)
                    #writing read value to destination
                    ws1.cell(row = i, column = j+int(m[y])).value = c.value
        wb1.save(new_path+'data.xlsx')

问题原因

  1. 重复加载目标工作簿:每次处理源文件时都重新从磁盘加载data.xlsx,之前写入的内容会被覆盖,最终仅保留最后一次写入结果。
  2. 循环逻辑错误:每个源文件都遍历了所有目标列(y从0到2),导致每个文件的数据都被写入A、D、G三列,最后一个文件直接覆盖了之前所有写入内容。

修正后的代码

import os
from openpyxl import load_workbook

# 替换为实际路径(确保路径末尾带斜杠)
file_path = "你的源文件文件夹路径/"
new_path = "目标文件路径/"

# 仅加载一次目标工作簿,避免覆盖之前修改
wb1 = load_workbook(new_path + 'data.xlsx')
ws1 = wb1.active

# 获取所有源Excel文件,按顺序处理
excel_files = [f for f in os.listdir(file_path) if f.endswith('.xlsx')]
# 对应目标列的偏移量:A(0)、D(3)、G(6)
column_offsets = [0, 3, 6]

# 仅处理前3个文件,匹配测试场景
for idx, file in enumerate(excel_files[:3]):
    print(f'Loading file {file}...')
    wb = load_workbook(file_path + file)
    ws = wb.worksheets[0]
    
    mr = ws.max_row
    mc = ws.max_column
    current_offset = column_offsets[idx]  # 当前文件对应的列偏移
    
    # 仅写入当前文件对应的目标列区域
    for i in range(1, mr + 1):
        for j in range(1, mc + 1):
            source_cell = ws.cell(row=i, column=j)
            ws1.cell(row=i, column=j + current_offset).value = source_cell.value

# 统一保存最终结果
wb1.save(new_path + 'data.xlsx')

修正说明

  • 提前加载目标工作簿,避免每次循环重新加载导致的内容覆盖
  • 通过enumerate获取文件索引,匹配对应的列偏移量,每个文件仅写入指定目标列
  • 限制处理前3个文件,贴合测试需求

内容的提问来源于stack exchange,提问作者rhynohorn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 02:25:40