Python openpyxl-“复制/粘贴”单元格范围

Python openpyxl-“复制/粘贴”单元格范围,python,copy-paste,openpyxl,excel-automation,Python,Copy Paste,Openpyxl,Excel Automation,我是Python新手,我正在尝试使用openpyxl库使我的一些VBA代码适应Python。在这个特殊的例子中,我试图根据标题中的字符串从工作簿中复制一列468行,并将它们粘贴到另一个工作簿中具有另一个特定字符串作为标题的特定列中。我不能简单地选择要复制的单元格范围,因为这是报表自动化的一部分,并且标题会在不同文件之间改变位置 我需要使用什么函数将一个工作簿中的468个单元格复制到第二个工作簿的468个单元格中?或者,如何复制一系列单元格,然后将它们粘贴到另一个工作簿中?这是我的代码,我知道到底

我是Python新手,我正在尝试使用openpyxl库使我的一些VBA代码适应Python。在这个特殊的例子中,我试图根据标题中的字符串从工作簿中复制一列468行,并将它们粘贴到另一个工作簿中具有另一个特定字符串作为标题的特定列中。我不能简单地选择要复制的单元格范围,因为这是报表自动化的一部分,并且标题会在不同文件之间改变位置


我需要使用什么函数将一个工作簿中的468个单元格复制到第二个工作簿的468个单元格中?或者,如何复制一系列单元格,然后将它们粘贴到另一个工作簿中?这是我的代码,我知道到底出了什么问题:我将第一个工作簿的最后一个单元格重复复制到第二个工作簿的468个单元格中

#!/usr/bin/python3

import pdb
import openpyxl
from openpyxl.utils import column_index_from_string

wb1 = openpyxl.load_workbook('.../Extraction.xlsx')
wb2 = openpyxl.load_workbook('.../Template.xlsx')

ws1 = wb1.active
first_row1 = list(ws1.rows)[0]             #to select the first row (header)
for cell in first_row1:
    if cell.value == "email":
        x = cell.column                    #to get the column
        y = column_index_from_string(x)    #to get the column's index

for i in range(2, 469):
    cell_range1 = ws1.cell(i, y)           #the wrong part

ws2 = wb2.active
first_row2 = list(ws2.rows)[0]
for cell in first_row2:
    if cell.value == "emailAddress":
        w = cell.column
        z = column_index_from_string(w)

for o in range(2, 469):
    cell_range2 = ws2.cell(o, z)
    cell_range2.value = cell_range1.value

path = '.../Test.xlsx'
wb2.save(path)

您可能需要将输入翻转到.cell,我猜是.cellcolumn,row。或者只使用关键字。cellcolumn=z,row=o

两个行迭代器都需要动态索引,同时将列索引保留在找到它们的位置:

for o in range(2, 469):
    #note the common o for both, could also be o+1 for one if there is an offset
    ws2.cell(o, z).value = ws1.cell(o, y).value

实际上,创建这样一个函数非常容易:

from openpyxl.utils import rows_from_range

def copy_range(range_str, src, dst):

    for row in rows_from_range(range_str):
        for cell in row:
            dst[cell].value = src[cell].value

    return

请注意,range_str是一个常规字符串,如A1:B2和src以及dest都必须是有效的图纸对象。但是,如果要复制大范围,这可能需要一段时间,因为读/写操作似乎相当耗时。

问题是什么?我需要使用什么函数将一个工作簿中的468个单元格复制到第二个工作簿的468个单元格中?如您所见,我找到了一种方法,将第一个工作簿的最后一个单元格重复复制到第二个工作簿的468个单元格中。或者,我如何复制一系列单元格,然后将它们粘贴到另一个工作簿中?没有这样的函数,您必须自己编写。谢谢您的回答,Charlie,但我正在努力编写此函数。这不是代码中不起作用的部分。问题是:我需要使用什么函数将一个工作簿中的468个单元格复制到第二个工作簿的468个单元格中?如您所见,我找到了一种方法,将第一个工作簿的最后一个单元格重复复制到第二个工作簿的468个单元格中。或者,我如何复制一系列单元格,然后将它们粘贴到另一个工作簿中?要复制的函数只是为单元格赋值。我想,至少我是这样使用的。尝试使用.cellcolumn=z,row=o.value分配一些内容,其中z和o的值也有一些。当然,您需要在左侧运行标记:ws2.cello,z.value=ws1.celli,y.value。你是这样做的吗?但是需要为它们都使用动态索引,我在上面添加了一个示例。是的,这与我在上面写的内容相同。您不需要指定给该范围。