Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 6, 2023 19:39:10

Fish_sub
Зарегистрирован: 2023-01-06
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Как в openpyxl копировать диапазон ячеек и вставлять в любую часть листа Excel?

Как взять диапазон ячеек, скопировать их и вставить в другую часть этого же листа? Например, есть диапазон заполненных ячеек от А12 до AU200, надо этот диапазон вставить от A201 до AU389.

Офлайн

#2 Янв. 7, 2023 08:33:46

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9874
Репутация: +  854  -
Профиль   Отправить e-mail  

Как в openpyxl копировать диапазон ячеек и вставлять в любую часть листа Excel?

Ты можешь набрать ячейки исходного диапазона в список. Потом получить ячейку, которая начинает диапазон назначения, и просто проходить по этому списку, брать значение каждой ячейки и записывать её в текущую ячейку назначения. Ячейку назначения можно сдвигать через shift.

Если бы ты написал код, тебе бы помогли его поправить.



Отредактировано py.user.next (Янв. 7, 2023 08:34:42)

Офлайн

#3 Янв. 7, 2023 19:01:51

Fish_sub
Зарегистрирован: 2023-01-06
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Как в openpyxl копировать диапазон ячеек и вставлять в любую часть листа Excel?

py.user.next
Ты можешь набрать ячейки исходного диапазона в список. Потом получить ячейку, которая начинает диапазон назначения, и просто проходить по этому списку, брать значение каждой ячейки и записывать её в текущую ячейку назначения. Ячейку назначения можно сдвигать через shift.Если бы ты написал код, тебе бы помогли его поправить.

Этот способ понятен, я его реализовал, но думал, что есть решение проще, но не смог его нигде найти. Копирование данных с помощью цикла по ячейкам не очень хороший вариант, т.к. он очень ресурсозатратный. Копирование таким способом диапазона в 1 900 строк и 37 столбцов занимает около 30 минут. А если таблица имеет 40 000 строк? А если 200 000 строк? В таком случае завершение работы программы можно ждать сутками.

Сейчас использую такой код:

 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)

Офлайн

#4 Янв. 7, 2023 19:28:45

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1355
Репутация: +  119  -
Профиль   Отправить e-mail  

Как в openpyxl копировать диапазон ячеек и вставлять в любую часть листа Excel?

скинь файл с которого нужно взять значения

Офлайн

#5 Янв. 7, 2023 20:49:39

Fish_sub
Зарегистрирован: 2023-01-06
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Как в openpyxl копировать диапазон ячеек и вставлять в любую часть листа Excel?

xam1816
скинь файл с которого нужно взять значения
Да это не особо важно, какая таблица. Пусть будет вот эта для примера. Приложил и то, какая таблица должна получиться на выходе.

Прикреплённый файлы:
attachment primer.xlsx (167,7 KБ)

Офлайн

#6 Янв. 7, 2023 20:50:36

Fish_sub
Зарегистрирован: 2023-01-06
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Как в openpyxl копировать диапазон ячеек и вставлять в любую часть листа Excel?

А вот такая таблица должна получиться на выходе.

Прикреплённый файлы:
attachment primer(должно получиться на выходе).xlsx (324,7 KБ)

Офлайн

#7 Янв. 7, 2023 21:07:50

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9874
Репутация: +  854  -
Профиль   Отправить e-mail  

Как в openpyxl копировать диапазон ячеек и вставлять в любую часть листа Excel?

Fish_sub
Этот способ понятен, я его реализовал, но думал, что есть решение проще, но не смог его нигде найти. Копирование данных с помощью цикла по ячейкам не очень хороший вариант, т.к. он очень ресурсозатратный.
А ты знаешь, что каждая ячейка хранит свой формат? Ты не можешь взять пачку ячеек и куда-то там скопировать, потому что у них могут быть разные форматы. Тысяча ячеек - тысяча форматов. Каждый формат нужно брать и копировать тоже. Поэтому там и нет этих методов. Если они и бывают где-то, они так же строятся на этом переборе ячеек по одной штуке.

Fish_sub
А если 200 000 строк?
Там сам Excel повиснет, потому что он точно так же разбирает эти форматы ячеек. Он не повиснет только потому, что он работает с листом как с разреженным массивом. То есть он работает с небольшой областью, которую вот на экране видно, а всё остальное он обрабатывает, когда туда экран доходит только.

Поэтому к тебе вопрос: а с какого хера у тебя большие данные (ну, назовём их так, хотя это мелкие данные) хранятся в Excel'евском формате?

Fish_sub
есть решение проще, но не смог его нигде найти
Потому что никто с этим так не работает. Поэтому ты и не смог найти. Запомни: Excel - это не средство для работы с базами данных, а это просто параша для бухгалтерш всяких тупых, и формат этот соответствующий. Красивые ячейки можно рисовать, а большие данные обрабатывать нельзя.

Ты должен перегнать это всё в нормальный формат, в какую-нибудь базу данных, и работать с этими данными в базе данных средствами системы управления базами данных (СУБД). Можешь в CSV перегнать и с CSV работать. Можешь в текст перегнать и работать с текстовым файлом. Но в xls не надо ключик искать, там его нет. XLSX ещё можно распаковать и заморочиться там с сырыми данными ячеек, там не сложно, но обычно это нафиг не надо делать.

Если у тебя там бухгалтерша образовалась, то ты потом, поработав с этими данными нормально, перегоняешь это для этой тупой бухгалтерши в Excel'евский формат. Сначала из него перегоняешь в базу, потом работаешь с ними, а потом обратно перегоняешь результат, чтобы эта тупая бухгалтерша могла открывать это у себя в тупой программе этой. Всякие там биологи с молекулами ДНК, математики со всякими числовыми гипотезами, физики со всякими атомами, астрономы со всякими звёздными расстояниями, экономисты со своими котировками - это всё из той же оперы. Не нужно идти за ними на поводу. Они в компах вообще нули полные. Поэтому они не знают, чем данные нужно обрабатывать. Они в этом ничего не смыслят. Они тебе будут про Excel втирать, что это классная программа и в ней очень классно всё хранить.



Отредактировано py.user.next (Янв. 7, 2023 21:18:17)

Офлайн

#8 Янв. 8, 2023 00:06:37

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1355
Репутация: +  119  -
Профиль   Отправить e-mail  

Как в openpyxl копировать диапазон ячеек и вставлять в любую часть листа Excel?

Fish_sub
1 900 строк и 37 столбцов занимает около 30 минут

ну у меня 200 000 строк где-то около 5 секунд обработало, но это без форматирования, просто значения ну и ширину. А если с выравниваниями там и шрифтами , методом copy() попробовал делать, очень долго выходит

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

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version