Форум сайта python.su
Как взять диапазон ячеек, скопировать их и вставить в другую часть этого же листа? Например, есть диапазон заполненных ячеек от А12 до AU200, надо этот диапазон вставить от A201 до AU389.
Офлайн
Ты можешь набрать ячейки исходного диапазона в список. Потом получить ячейку, которая начинает диапазон назначения, и просто проходить по этому списку, брать значение каждой ячейки и записывать её в текущую ячейку назначения. Ячейку назначения можно сдвигать через shift.
Если бы ты написал код, тебе бы помогли его поправить.
Отредактировано py.user.next (Янв. 7, 2023 08:34:42)
Офлайн
py.user.next
Ты можешь набрать ячейки исходного диапазона в список. Потом получить ячейку, которая начинает диапазон назначения, и просто проходить по этому списку, брать значение каждой ячейки и записывать её в текущую ячейку назначения. Ячейку назначения можно сдвигать через shift.Если бы ты написал код, тебе бы помогли его поправить.
for row in sheet[diap_start:diap_end]: start_append += 1 end_append = -1 for cell in row: end_append += 1 sheet[start_append][end_append].value = cell.value
Отредактировано Fish_sub (Янв. 7, 2023 19:02:32)
Офлайн
скинь файл с которого нужно взять значения
Офлайн
xam1816Да это не особо важно, какая таблица. Пусть будет вот эта для примера. Приложил и то, какая таблица должна получиться на выходе.
скинь файл с которого нужно взять значения
Прикреплённый файлы:
primer.xlsx (167,7 KБ)
Офлайн
А вот такая таблица должна получиться на выходе.
Прикреплённый файлы:
primer(должно получиться на выходе).xlsx (324,7 KБ)
Офлайн
Fish_subА ты знаешь, что каждая ячейка хранит свой формат? Ты не можешь взять пачку ячеек и куда-то там скопировать, потому что у них могут быть разные форматы. Тысяча ячеек - тысяча форматов. Каждый формат нужно брать и копировать тоже. Поэтому там и нет этих методов. Если они и бывают где-то, они так же строятся на этом переборе ячеек по одной штуке.
Этот способ понятен, я его реализовал, но думал, что есть решение проще, но не смог его нигде найти. Копирование данных с помощью цикла по ячейкам не очень хороший вариант, т.к. он очень ресурсозатратный.
Fish_subТам сам Excel повиснет, потому что он точно так же разбирает эти форматы ячеек. Он не повиснет только потому, что он работает с листом как с разреженным массивом. То есть он работает с небольшой областью, которую вот на экране видно, а всё остальное он обрабатывает, когда туда экран доходит только.
А если 200 000 строк?
Fish_subПотому что никто с этим так не работает. Поэтому ты и не смог найти. Запомни: Excel - это не средство для работы с базами данных, а это просто параша для бухгалтерш всяких тупых, и формат этот соответствующий. Красивые ячейки можно рисовать, а большие данные обрабатывать нельзя.
есть решение проще, но не смог его нигде найти
Отредактировано py.user.next (Янв. 7, 2023 21:18:17)
Офлайн
Fish_sub
1 900 строк и 37 столбцов занимает около 30 минут
import openpyxl from copy import copy from openpyxl.utils import get_column_letter wb2 = openpyxl.Workbook() wb1 = openpyxl.load_workbook('/home/xam/Загрузки/primer.xlsx') sheet_1 = wb1.active sheet_2 = wb2.active def copy_cell(c1, c2): c2.value = c1.value # if c1.has_style: # если копировать форматирование ячеек то это ооочень долго # c2.font = copy(c1.font) # c2.border = copy(c1.border) # c2.fill = copy(c1.fill) # c2.number_format = copy(c1.number_format) # c2.protection = copy(c1.protection) # c2.alignment = copy(c1.alignment) for i in range(70): for r in range(1,3576): for c in range(1,5): if i > 0: c1 = sheet_1.cell(row=r+1, column=c) c2 = sheet_2.cell(row=r+(3575*i), column=c) else: c1 = sheet_1.cell(row=r, column=c) c2 = sheet_2.cell(row=r, column=c) copy_cell(c1, c2) for i in range(1, 5): sheet_2.column_dimensions[get_column_letter(i)].width = sheet_1.column_dimensions[get_column_letter(i)].width wb2.save('my_test.xlsx')
Офлайн