Python 如何循环遍历每个源文件,并将特定列复制到一个新工作簿中,每个新的;粘贴";切换到相邻的列?

Python 如何循环遍历每个源文件,并将特定列复制到一个新工作簿中,每个新的;粘贴";切换到相邻的列?,python,openpyxl,copy-paste,Python,Openpyxl,Copy Paste,我有3个Excel文件,每个工作簿(每个工作簿的第1页)中的单元格A1到A10(源单元格)中有一列数据。我想将数据从源单元格复制到新工作簿中,但每次都必须将数据移到新列中。 例如: 文件1中的源单元格必须复制到新工作簿中的A1至A10单元格 文件2中的源单元格必须复制到新工作簿中的B1至B10单元格;及 必须将文件3中的源单元格复制到新工作簿中的单元格C1到C10 我正在努力找出在每次迭代中调整代码中“j”的最佳方法。我也不确定最干净的方法是为不同的源文件运行每个函数 所有关于如何使这段代码更干

我有3个Excel文件,每个工作簿(每个工作簿的第1页)中的单元格A1到A10(源单元格)中有一列数据。我想将数据从源单元格复制到新工作簿中,但每次都必须将数据移到新列中。
例如:

  • 文件1中的源单元格必须复制到新工作簿中的A1至A10单元格
  • 文件2中的源单元格必须复制到新工作簿中的B1至B10单元格;及
  • 必须将文件3中的源单元格复制到新工作簿中的单元格C1到C10
  • 我正在努力找出在每次迭代中调整代码中“j”的最佳方法。我也不确定最干净的方法是为不同的源文件运行每个函数

    所有关于如何使这段代码更干净的建议也将被感激,因为我承认它现在是如此混乱

    提前谢谢

    import openpyxl as xl
    
    filename_1 = "C:\\workspace\\scripts\\file1.xlsx"
    filename_2 = "C:\\workspace\\scripts\\file2.xlsx"
    filename_3 = "C:\\workspace\\scripts\\file3.xlsx"
    
    destination_filename = "C:\\workspace\\scripts\\new_file.xlsx"
    
    num_rows = 10
    num_columns = 1
    
    
    def open_source_workbook(path):
        '''Open the workbook and worksheet in the source Excel file'''
        workbook = xl.load_workbook(path)
        worksheet = workbook.worksheets[0]
        return worksheet
    
    def open_destination_workbook(path):
        '''Open the destination workbook I want to copy the data to.'''
        new_workbook = xl.load_workbook(path)
        return new_workbook
    
    def open_destination_worksheet(path):
        '''Open the worksheet of the destination workbook I want to copy the data to.'''
        new_worksheet = new_workbook.active
        return new_worksheet
    
    def copy_to_new_file(worksheet, new_worksheet):
        for i in range (1, num_rows + 1):
            for j in range (1, num_columns + 1):
                c = worksheet.cell(row = i, column = j)
                new_worksheet.cell(row = i, column = j).value = c.value
    
    worksheet = open_source_workbook(filename_1)
    new_workbook = open_destination_workbook(destination_filename)
    new_worksheet = open_destination_worksheet(new_workbook)
    copy_to_new_file(worksheet, new_worksheet)
    new_workbook.save(str(destination_filename))
    
    问题:循环文件,复制特定列,并将每个新“粘贴”移动到相邻列

    此方法首先从所有文件聚合列单元格值。
    然后重新设置它的范围,以便它可以被
    openpyxl.append(…
    方法使用。
    因此,不需要目标列知识


    参考

    • 有序字典与常规字典一样,但具有一些与排序操作相关的额外功能

    • 将Excel样式坐标转换为(行、列)元组

    • 按行从工作表生成单元格。使用行和列的索引指定迭代范围

    • 返回一个迭代器,该迭代器将函数应用于iterable的每个项,并生成结果

    • 制作一个迭代器,聚合来自每个ITerable的元素


  • 进口二手货

    import openpyxl as opxl
    from collections import OrderedDict
    
  • 顺序定义文件dict
    以保留文件列顺序

    file = OrderedDict.fromkeys(('file1', 'file2', 'file3'))
    
  • 将范围定义为索引值。 将Excel A1表示法转换为索引值

    min_col, max_col, min_row, max_row =  
        opxl.utils.cell.range_to_tuple('DUMMY!A1:A10')[1]
    
  • 循环定义的文件,
    加载每个工作簿并获取对默认工作表的引用
    从定义的范围中获取单元格值:
    最小列=1,最大列=1,最小行=1,最大行=10

    for fname in file.keys(): 
        wb = openpyxl.load_workbook(fname)
        ws = wb.current()
        file[fname] =  ws.iter_rows(min_row=min_row, 
                                    max_row=max_row,
                                    min_col=min_col,
                                    max_col=max_col, 
                                    values_only=True)
    
  • 定义新工作簿并获取对默认工作表的引用

    wb2 = opxl.Workbook()
    ws2 = wb2.current()
    
    for row_value in map(lambda r:tuple(v for c in r for v in c), 
                         zip(*(file[k] for k in file))
                        ):
        ws2.append(row_value)
    
  • 压缩所有文件中每行的值
    使用
    lambda
    将压缩的元组列表映射为行值列表。
    将值列表附加到新工作表

    wb2 = opxl.Workbook()
    ws2 = wb2.current()
    
    for row_value in map(lambda r:tuple(v for c in r for v in c), 
                         zip(*(file[k] for k in file))
                        ):
        ws2.append(row_value)
    
  • 保存新工作簿

    # wb2.save(...)
    
  • 问题:循环文件,复制特定列,并将每个新“粘贴”移动到相邻列

    此方法首先从所有文件聚合列单元格值。
    然后重新设置它的范围,以便它可以被
    openpyxl.append(…
    方法使用。
    因此,不需要目标列知识


    参考

    • 有序字典与常规字典一样,但具有一些与排序操作相关的额外功能

    • 将Excel样式坐标转换为(行、列)元组

    • 按行从工作表生成单元格。使用行和列的索引指定迭代范围

    • 返回一个迭代器,该迭代器将函数应用于iterable的每个项,并生成结果

    • 制作一个迭代器,聚合来自每个ITerable的元素


  • 进口二手货

    import openpyxl as opxl
    from collections import OrderedDict
    
  • 顺序定义文件dict
    以保留文件列顺序

    file = OrderedDict.fromkeys(('file1', 'file2', 'file3'))
    
  • 将范围定义为索引值。 将Excel A1表示法转换为索引值

    min_col, max_col, min_row, max_row =  
        opxl.utils.cell.range_to_tuple('DUMMY!A1:A10')[1]
    
  • 循环定义的文件,
    加载每个工作簿并获取对默认工作表的引用
    从定义的范围中获取单元格值:
    最小列=1,最大列=1,最小行=1,最大行=10

    for fname in file.keys(): 
        wb = openpyxl.load_workbook(fname)
        ws = wb.current()
        file[fname] =  ws.iter_rows(min_row=min_row, 
                                    max_row=max_row,
                                    min_col=min_col,
                                    max_col=max_col, 
                                    values_only=True)
    
  • 定义新工作簿并获取对默认工作表的引用

    wb2 = opxl.Workbook()
    ws2 = wb2.current()
    
    for row_value in map(lambda r:tuple(v for c in r for v in c), 
                         zip(*(file[k] for k in file))
                        ):
        ws2.append(row_value)
    
  • 压缩所有文件中每行的值
    使用
    lambda
    将压缩的元组列表映射为行值列表。
    将值列表附加到新工作表

    wb2 = opxl.Workbook()
    ws2 = wb2.current()
    
    for row_value in map(lambda r:tuple(v for c in r for v in c), 
                         zip(*(file[k] for k in file))
                        ):
        ws2.append(row_value)
    
  • 保存新工作簿

    # wb2.save(...)
    

  • 感谢您的详细回复和解释。我将详细地完成此操作!感谢您的详细回复和解释。我将详细地完成此操作!