Openpyxl - Как скопировать диапазон данных из листа Excel в другой - PullRequest
0 голосов
/ 03 марта 2020

Я пытаюсь скопировать диапазон данных на основе координат строки с листа на другой.

У меня есть список с координатами строки tbrow = [1, 34, 52, 75, 101]

Я хотел бы скопировать диапазон строк с:

1 до 34 с листа 0 на лист 1,

34 до 52 от листа 0 до листа 2,

52 до 75 от листа 0 до листа 3,

75 до 101 от листа 0 до листа 4.

До сих пор я пробовал следующее:

-Получить основной лист 0

sheet0 = wb["Sheet"]

Затем я сохранил листы в переменной , игнорируя первый лист

sheets = wb.worksheets[1:]

В итоге я попытался скопировать данные значения.

for i in range(tbrow[i],tbrow[i]+1) for j in range(1,sheet0.max_column+1): for k in sheets: k.cell(row=i, column=j).value = sheet0.cell(row=i, column=j).value

Проблема в том, что я копирую только первый ряд на остальные листы, а не на весь диапазон. (1-34; 34-52 и т. Д.) Чего мне не хватает?

Может кто-нибудь помочь мне с организацией логи c здесь? Или предоставить решение?

Спасибо!

ОБНОВЛЕНИЕ

Другим подходом было нарезать список.

a,b = tbrow[:2] for i in range(a,b): for j in range(1,sheet1.max_column+1): for k in sheets: k.cell(row=i, column=j).value = sheet1.cell(row=i, column=j).value

Но это берет только первые две координаты строки из списка, и я хотел бы go для следующего элемента в списке:

- От первого к второму

- от второго к третьему

- от третьего к четвертому

... и т. Д. -

1 Ответ

0 голосов
/ 03 марта 2020

Проблема, которую я замечаю с вашим кодом, заключается в значении i внутри метода range. i внутри метода range не совпадает с i, используемым в для l oop. Я предполагаю, что у вас должно быть глобальное определение i=0, которое затем не обновляется, поэтому на следующий лист копируются только первые строки.

for i in range(tbrow[i],tbrow[i]+1):#------here
    for j in range(1,sheet0.max_column+1):
        for k in sheets:
            k.cell(row=i, column=j).value = sheet0.cell(row=i, column=j).value

Рассмотрите возможность использования функции, в которой вы можете передать значения строк

def addRowsToSheet(lb,ub):
    for i in range(lb,ub):#------here
        for j in range(1,sheet0.max_column+1):
              #consider using switch case, instad of the loop
              switch (ub):
                  case 34:
                    sheets[0].cell(row=i, column=j).value = sheet0.cell(row=i, column=j).value;
                    sheets[1].cell(row=i, column=j).value = sheet0.cell(row=i, column=j).value;
                  case 52:
                    sheets[2].cell(row=i, column=j).value = sheet0.cell(row=i, column=j).value;

              #Do the same logic below

#calls
for i in range(0,len(tbrow)-1):
     addRowsToSheet(tbrow[i],tbrow[i+1])

...