Вопрос или проблема
У меня есть данные в 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)
Объяснение кода:
-
Импорт библиотек: В самом начале мы импортируем необходимые библиотеки, такие как
os
иopenpyxl
. -
Установка пути к файлам: Определяем путь к папке и файлам исходников и назначения.
-
Открытие рабочих книг: Загружаем рабочие книги из файлов, указанных ранее.
-
Выбор диапазона: Задаём диапазон ячеек для копирования (
range_str
) иdst_top_left
— ячейку, с которой начнётся вставка. -
Координаты и смещение: Получаем верхнюю левую ячейку исходного диапазона и рассчитываем смещение по строкам и столбцам.
-
Цикл копирования: Вложенный цикл перебирает строки и ячейки в определенном диапазоне. Для каждой ячейки копируется значение в новую целевую ячейку с учётом смещения.
-
Сохранение файла: После завершения всех операций изменения сохраняются в целевом файле.
Этот код позволяет гибко и эффективно копировать данные из одной книги в другую, продолжая сохранять структуру данных, но в новом месте. Не забудьте модифицировать строки range_str
и dst_top_left
, чтобы указать нужные диапазоны перед запуском кода.