>我有 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(...
方法使用。
因此,不需要目标列知识。
参考资料:
-
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)
创建一个迭代器,聚合来自每个可迭代对象的元素。
-
二手进口
import openpyxl as opxl from collections import OrderedDict
-
定义
OrderedDict
中的文件以保留文件<=>列顺序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]
-
循环定义的文件,
加载每个工作簿并获取对默认工作表
的引用,从定义的范围内获取单元格值: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)
-
定义新工作簿并获取对默认工作表的引用
wb2 = opxl.Workbook() ws2 = wb2.current()
-
从所有文件中压缩值,每行一行
使用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)
-
保存新工作簿
# wb2.save(...)