#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. Это на самом деле сработало идеально. Я довольно новичок в программировании, поэтому, когда вы упомянули параметры, я начал путаться. Теперь я понимаю, и ваше решение сработало. Спасибо!