如何遍历每个源文件并将特定列复制到新工作簿中,并将每个新"paste"移动到相邻列?



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

  1. 文件1中的源单元格必须复制到新工作簿中的单元格A1到A10;
  2. 文件2中的源单元格必须复制到新工作簿中的单元格B1到B10;和
  3. 文件 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(...方法使用。
因此,不需要目标列知识。


参考资料:

  • class collections.OrderedDict([items])

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

  • openpyxl.utils.cell.coordinate_to_tuple(coordinate)

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

  • iter_rows(min_row=None, max_row=None, min_col=None, max_col=None, values_only=False)

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

  • map(function, iterable, ...)

    返回一个迭代器,该迭代器将函数应用于可迭代对象的每个项,从而生成结果。

  • zip(*iterables)

    创建一个迭代器,聚合来自每个可迭代对象的元素。


  1. 二手进口

    import openpyxl as opxl
    from collections import OrderedDict
    
  2. 定义OrderedDict中的文件以保留文件<=>列顺序

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

    min_col, max_col, min_row, max_row =  
    opxl.utils.cell.range_to_tuple('DUMMY!A1:A10')[1]
    
  4. 循环定义的文件,
    加载每个工作簿并获取对默认工作表
    的引用,从定义的范围内获取单元格值:
    min_col=1, max_col=1, min_row=1, max_row=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)
    
  5. 定义新工作簿并获取对默认工作表的引用

    wb2 = opxl.Workbook()
    ws2 = wb2.current()
    
  6. 从所有文件中压缩值,每行一行
    使用lambda映射压缩的元组列表以平展为行值列表。
    将值列表追加到新工作表

    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)
    
  7. 保存新工作簿

    # wb2.save(...)
    

最新更新