关于python:openpyxl-“复制/粘贴”单元格范围

openpyxl - “copy/paste” range of cells

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

将一个工作簿的468个单元格中的每一个复制到第二个工作簿的468个单元格中,我需要使用什么功能? 或者,如何复制一定范围的单元格,然后将其粘贴到另一个工作簿中? 这是我的代码,我确切地知道出了什么问题:我正在将一个单元格(第一个工作簿中的最后一个)重复复制到第二个工作簿的468个单元格中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/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)


创建这样的函数实际上很容易:

1
2
3
4
5
6
7
8
9
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都必须是有效的工作表对象。 但是,如果要复制较大的范围,则可能要花一些时间,因为读/写操作似乎很耗时。


您可能必须将输入翻转为.cell(),我想它是.cell(column, row)。 或者只使用关键字.cell(column=z, row=o)

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

1
2
3
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