Скопируйте любой диапазон Excel из одной книги в другую книгу в другой диапазон - openpyxl, python

У меня есть некоторые данные 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))

Вы используете ту же ячейку назначения, что и исходная dst[cell].value = src[cell].value, поскольку cell — это та же координата. Вы можете использовать openpyxl cell offset для настройки строки и столбца на стороне назначения. Например, dst[cell].offset(row=2, column=3).value = src[cell].value, чтобы дублировать пример операции в вашем вопросе.

moken 31.03.2023 09:25

Используйте объект CellRange(), чтобы сделать вычисления для вас. Затем вы можете zip() работать над обоими параллельно.

Charlie Clark 31.03.2023 11:52

Спасибо Мокену и Чарли Кларку за то, что нашли время и предоставили мне некоторое представление о смещениях и объектах Cellrange.

Boomer 31.03.2023 17:27
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы немного расширить мой комментарий, вы можете включить расчет смещений в код.
Пример, вместо того, чтобы выяснять, что необходимые смещения строки и столбца равны 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.

Charlie Clark 31.03.2023 11:52

Другие вопросы по теме