Как вставить пустую строку перед определенными значениями ячеек в Python?

#python #excel #openpyxl

Вопрос:

Я использую библиотеку Openpyxl

У меня есть 15 функций, которые выглядят идентично приведенной ниже, только с разными строками. Я пытался объединить их в одну функцию, но это просто делает весь лист пустыми строками. Единственный способ, который я нашел до сих пор, — это иметь индивидуальную функцию для каждого из них с перерывом в ней.

Это единственный способ или есть более простой и эффективный способ сделать это?

 import openpyxl

pws = openpyxl.load_workbook(filepath.xlsx)
pws_sheet = pws['Sheet']

def ans_call_by_agent():
    flag=False
    for row in pws_sheet.iter_rows():
        for cell in row:
            if cell.value == 'Ans. Call Distribution by Agent':
                pws_sheet.insert_rows(cell.row, amount=1)
                pws.create_sheet('Ans. Call by Agent')
                flag=True
        if flag:break
        else:
            continue
def all_calls_by_hour():
    flag=False
    for row in pws_sheet.iter_rows():
        for cell in row:
            if cell.value == 'All Call Distribution by Hour':
                pws_sheet.insert_rows(cell.row, amount=1)
                pws.create_sheet('All Calls by Hour')
                flag=True
        if flag:break
        else:
            continue
#call blank row functions
ins_agent_availability_detail()
ins_agent_missed_calls()
ins_all_calls_by_day()
ins_all_calls_by_day_of_week()
ins_all_calls_by_hour()
ins_all_calls_by_queue()
ins_all_service_level()
ins_ans_calls_agent()
ins_ans_calls_by_queue()
ins_ans_call_detail()
ins_ans_service_level()
ins_call_disconnection_cause()
ins_unans_calls_by_queue()
ins_unans_call_detail()
ins_unans_service_level()
 

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

 def ans_calls_by_agent():
    #flag=False
    for row in pws_sheet.iter_rows():
        for cell in row:
            if cell.value == 'Ans. Call Distribution by Agent':
                pws_sheet.insert_rows(cell.row, amount=1)
                pws.create_sheet('Ans. Call by Agent')
                pws_sheet.delete_rows(cell.row, amount=1)
            elif cell.value == 'All Call Distribution by Hour':
                pws_sheet.insert_rows(cell.row, amount=1)
                pws.create_sheet('All Calls by Hour')
                pws_sheet.delete_rows(cell.row, amount=1)
            #flag=True
        #if flag:break
        else:
            continue
 

Если я закомментирую строки флага и добавлю pws_sheet.delete_rows(cell.row,amount=1) , то это будет продолжаться, но только тогда, когда cell.value они будут удалены, и я бы предпочел, чтобы это не было решением.

Комментарии:

1. Не совсем ясно, в чем проблема. В своем заголовке вы спрашиваете, как вставить пустую строку, но кажется, что вы уже решили эту проблему. Вы также спрашиваете об эффективности, пытаетесь ли вы уменьшить дублирование кода или повысить производительность?

2. прямо сейчас у меня есть 15 функций, которые почти точно совпадают. Я думаю, я просто хотел знать, могу ли я втиснуть их все в одну функцию вместо того, чтобы вызывать 15 разных, которые по сути делают одно и то же. Я отредактировал приведенный выше код, чтобы отразить то, что мне нужно сделать.

3. Вы сказали, что пытались объединить в единую функцию; можете ли вы поделиться своей попыткой?

4. Я предоставил единственную попытку функции в основном сообщении. Если я удалю if flag:break , то весь лист станет пустыми строками, и с помощью первого оператора if будет создано множество новых листов.

5. Единственная функция устанавливается flag=True для первой ячейки независимо от того, что cell.value это такое. Вы пробовали написать функцию, используя свои 2 строки в качестве параметра?

Ответ №1:

Делает;

 def ans_calls_by_agent(compare_val, create_name):
    for row in pws_sheet.iter_rows():
        for cell in row:
            if cell.value == compare_val:
                pws_sheet.insert_rows(cell.row, amount=1)
                pws.create_sheet(create_name)
                pws_sheet.delete_rows(cell.row, amount=1)
                break
 

Не работает?

Логика с flag избыточна. Во втором примере вы также поместили flag=True часть за пределы if утверждения, и поэтому она всегда будет иметь значение True, чего вы, скорее всего, не захотите.

Комментарии:

1. Это на самом деле сработало идеально. Я довольно новичок в программировании, поэтому, когда вы упомянули параметры, я начал путаться. Теперь я понимаю, и ваше решение сработало. Спасибо!