У меня есть некоторые данные Excel, которые я хотел бы скопировать диапазон значений ячеек с одного листа и вставить их в другую книгу/лист/любой диапазон, который я выберу. У меня есть рабочие книги openpyxl, а также выбор диапазона для копирования. Но моя копия будет вставлена только в ту же область диапазона, с которой она началась в исходной книге. Я хотел бы выбрать другой диапазон вставки. Также диапазон может быть как большим, так и маленьким, как вы выберете.
Я пробовал несколько других сообщений, перечисленных здесь, однако ни один из них на самом деле не указывает способ изменить область диапазона назначения или позволить вам выбрать, где вы хотите разместить выбранный диапазон. Я чувствую, что мне понадобится еще один цикл FOR для процесса вставки, но я не знаю, как его записать. Буду признателен за любую помощь в этом.
Пример операции
Excel Sheet Source Excel Sheet Destination
A B A B C D E
1 a e 1
2 b f 2
3 a e
4 b f
Пример кода
import os
import openpyxl as xl
from openpyxl.utils import rows_from_range
#Assign Folder & Files variables
desktop = os.path.join(os.path.join(os.environ['USERPROFILE']), 'Desktop')
practicefolder = 'Practice'
source_file = 'source_file.xlsx'
destination_file = 'destination_file.xlsx'
# opening the source excel file
filename = (desktop + '\\' + practicefolder + '\\' + source_file)
wb1 = xl.load_workbook(filename)
ws1 = wb1.worksheets[0]
# opening the destination excel file
filename1 = (desktop + '\\' + practicefolder + '\\' + destination_file)
#dest = 'dest_sheet2' #For assigning different sheet
wb2 = xl.load_workbook(filename1)
ws2 = wb2.active
#Selecting the copy range below
range_str = 'A1:B2' #Select copy range
src = ws1
dst = ws2
for row in rows_from_range(range_str):
for cell in row:
dst[cell].value = src[cell].value
wb2.save(str(filename1))
Используйте объект CellRange()
, чтобы сделать вычисления для вас. Затем вы можете zip()
работать над обоими параллельно.
Спасибо Мокену и Чарли Кларку за то, что нашли время и предоставили мне некоторое представление о смещениях и объектах Cellrange.
Чтобы немного расширить мой комментарий, вы можете включить расчет смещений в код.
Пример, вместо того, чтобы выяснять, что необходимые смещения строки и столбца равны 2 и 3 соответственно, мы можем просто ввести координату ячейки нового местоположения «D3», и код вычислит это.
В приведенном ниже примере кода я включил новую переменную dst_top_left
, которая является верхней левой ячейкой, куда должны быть скопированы исходные данные. В вашем примере это «D3». Затем код определяет, что смещение строки равно 2, а смещение столбца — 3, и устанавливает их при копировании данных.
При копировании переносятся только значения ячеек, форматирование ячеек не копируется.
Обратите внимание, что в верхней части примера кода есть дополнительный импорт, поэтому неизмененный код в середине не отображается.
from openpyxl.utils.cell import coordinate_to_tuple as ctt
...
# opening the source excel file
filename = (desktop + '\\' + practicefolder + '\\' + source_file)
wb1 = xl.load_workbook(source_file)
src = wb1.worksheets[0]
# opening the destination excel file
filename1 = (desktop + '\\' + practicefolder + '\\' + destination_file)
# dest = 'dest_sheet2' #For assigning different sheet
wb2 = xl.load_workbook(destination_file)
dst = wb2.active
# Selecting the copy range below
range_str = 'A1:B2' # Select copy range
### Set the top left cell of the destination range
dst_top_left = 'D3'
### Get a tuple of the difference between the src top left and dst top left
diff = tuple(x-y for x, y in zip(ctt(dst_top_left), ctt(range_str.split(':')[0])))
cr = CellRange(range_str)
for row in src.iter_rows(max_col=cr.max_col, min_col=cr.min_col, max_row=cr.max_row, min_row=cr.min_row):
for cell in row:
### Copy src cell value to the dst cell
dst[cell.coordinate].offset(row=diff[0], column=diff[1]).value = cell.value
wb2.save(destination_file)
Строки диапазона запрещены для всего, что связано с программированием! ;-) Вместо этого используйте объекты CellRange.
Вы используете ту же ячейку назначения, что и исходная dst[cell].value = src[cell].value, поскольку
cell
— это та же координата. Вы можете использовать openpyxlcell offset
для настройки строки и столбца на стороне назначения. Например, dst[cell].offset(row=2, column=3).value = src[cell].value, чтобы дублировать пример операции в вашем вопросе.