openpyxl - "copy/paste" 单元格范围
openpyxl - "copy/paste" range of cells
我是 Python 的新手,我正在尝试使用 openpyxl 库使我的一些 VBA 代码适应它。在这种特殊情况下,我试图根据 header 中的字符串从工作簿的单个列中复制 468 行,并将它们粘贴到另一个工作簿中的特定列中,该列具有另一个特定字符串作为 header。我不能简单地 select 我想要复制的单元格范围,因为这是报告自动化的一部分,并且 header 会在文件之间更改位置。
要将一个工作簿的 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()
,我猜是.cell(column, row)
。或者只使用关键字 .cell(column=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 都必须是有效的 sheet 对象。但是,如果您要复制大范围,这可能需要一段时间,因为 read/writes 似乎相当耗时。
我是 Python 的新手,我正在尝试使用 openpyxl 库使我的一些 VBA 代码适应它。在这种特殊情况下,我试图根据 header 中的字符串从工作簿的单个列中复制 468 行,并将它们粘贴到另一个工作簿中的特定列中,该列具有另一个特定字符串作为 header。我不能简单地 select 我想要复制的单元格范围,因为这是报告自动化的一部分,并且 header 会在文件之间更改位置。
要将一个工作簿的 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()
,我猜是.cell(column, row)
。或者只使用关键字 .cell(column=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 都必须是有效的 sheet 对象。但是,如果您要复制大范围,这可能需要一段时间,因为 read/writes 似乎相当耗时。