Скопировать любой диапазон 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

# Назначение переменных папки и файлов
desktop = os.path.join(os.path.join(os.environ['USERPROFILE']), 'Desktop')

practicefolder="Practice"
source_file="source_file.xlsx"
destination_file="destination_file.xlsx"


# Открытие исходного файла Excel
filename = (desktop + '\\' + practicefolder + '\\' + source_file)
wb1 = xl.load_workbook(filename)
ws1 = wb1.worksheets[0]

# Открытие целевого файла Excel
filename1 = (desktop + '\\' + practicefolder + '\\' + destination_file)
#dest="dest_sheet2"                          # Для назначения другого листа
wb2 = xl.load_workbook(filename1)
ws2 = wb2.active

# Выбор диапазона для копирования
range_str="A1:B2"                            # Выберите диапазон для копирования

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))

Чтобы немного расширить мой комментарий, вы можете включить расчет смещений в код.
Например, вместо того чтобы вычислять, что смещения по строкам и столбцам равны 2 и 3 соответственно, мы можем просто ввести координаты ячейки нового местоположения ‘D3’ и позволить коду рассчитать это.
В приведенном ниже примере кода я добавил новую переменную dst_top_left, которая представляет собой верхнюю левую ячейку, куда будут скопированы исходные данные. В вашем примере это ‘D3’. Код затем определяет, что смещение по строке равно 2, а смещение по столбцу равно 3, и устанавливает их при копировании данных.
Копируются только значения ячеек, форматирование ячеек не копируется.
Обратите внимание, что вверху примера кода есть дополнительный импорт, а затем неизмененный код в середине не отображается.

from openpyxl.utils.cell import coordinate_to_tuple as ctt

...

# Открытие исходного файла Excel
filename = (desktop + '\\' + practicefolder + '\\' + source_file)
wb1 = xl.load_workbook(source_file)
src = wb1.worksheets[0]

# Открытие целевого файла Excel
filename1 = (desktop + '\\' + practicefolder + '\\' + destination_file)
# dest="dest_sheet2"                          # Для назначения другого листа
wb2 = xl.load_workbook(destination_file)
dst = wb2.active

# Выбор диапазона для копирования
range_str="A1:B2"  # Выберите диапазон для копирования
### Установите верхнюю левую ячейку целевого диапазона
dst_top_left="D3"

### Получите кортеж разницы между верхней левой ячейкой src и dst
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:
        ### Копируйте значение ячейки src в ячейку dst
        dst[cell.coordinate].offset(row=diff[0], column=diff[1]).value = cell.value

wb2.save(destination_file)

Ответ или решение

Конечно, я помогу вам с решением задачи копирования диапазона ячеек из одной книги Excel в другую с использованием библиотеки Openpyxl в Python. Ниже представлена полная программа, которая реализует эту функцию. Код включает в себя возможность задания нового диапазона для вставки данных из исходной книги.

import os
import openpyxl as xl
from openpyxl.utils.cell import coordinate_to_tuple as ctt

# Указание папки и файлов
desktop = os.path.join(os.path.join(os.environ['USERPROFILE']), 'Desktop')

practicefolder = "Practice"
source_file = "source_file.xlsx"
destination_file = "destination_file.xlsx"

# Открытие файла-источника
filename = os.path.join(desktop, practicefolder, source_file)
wb1 = xl.load_workbook(filename)
src = wb1.active  # Используем первый лист

# Открытие файла-назначения
filename1 = os.path.join(desktop, practicefolder, destination_file)
wb2 = xl.load_workbook(filename1)
dst = wb2.active  # Используем активный лист

# Выбор диапазона для копирования
range_str = "A1:B2"  # Укажите диапазон, который хотите скопировать
dst_top_left = "D3"  # Укажите верхнюю левую ячейку для вставки

# Получение координат верхней левой ячейки источника и назначения
src_top_left = range_str.split(':')[0]  # Получаем верхнюю левую ячейку исходного диапазона
diff = tuple(ctt(dst_top_left)[i] - ctt(src_top_left)[i] for i in range(2))  # Разница в координатах

# Копирование данных
for row in src.iter_rows(min_row=int(src_top_left[1]), max_row=int(range_str.split(':')[1][1]), 
                         min_col=xl.utils.cell.column_index_from_string(src_top_left[0]),
                         max_col=xl.utils.cell.column_index_from_string(range_str.split(':')[1][0])):
    for cell in row:
        # Копирование значения в целевой диапазон с учётом сдвига
        dst.cell(row=cell.row + diff[0], column=cell.column + diff[1], value=cell.value)

# Сохранение изменений в целевом файле
wb2.save(filename1)

Объяснение кода:

  1. Импорт библиотек: В самом начале мы импортируем необходимые библиотеки, такие как os и openpyxl.

  2. Установка пути к файлам: Определяем путь к папке и файлам исходников и назначения.

  3. Открытие рабочих книг: Загружаем рабочие книги из файлов, указанных ранее.

  4. Выбор диапазона: Задаём диапазон ячеек для копирования (range_str) и dst_top_left — ячейку, с которой начнётся вставка.

  5. Координаты и смещение: Получаем верхнюю левую ячейку исходного диапазона и рассчитываем смещение по строкам и столбцам.

  6. Цикл копирования: Вложенный цикл перебирает строки и ячейки в определенном диапазоне. Для каждой ячейки копируется значение в новую целевую ячейку с учётом смещения.

  7. Сохранение файла: После завершения всех операций изменения сохраняются в целевом файле.

Этот код позволяет гибко и эффективно копировать данные из одной книги в другую, продолжая сохранять структуру данных, но в новом месте. Не забудьте модифицировать строки range_str и dst_top_left, чтобы указать нужные диапазоны перед запуском кода.

Оцените материал
Добавить комментарий

Капча загружается...