【问题标题】:How do I insert a blank row before specific cell values in Python?如何在 Python 中的特定单元格值之前插入空白行?
【发布时间】:2021-10-07 16:25:11
【问题描述】:

我正在使用库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 被删除并且我宁愿这不是解决方案时。

【问题讨论】:

  • 问题出在哪里还不完全清楚。在您的标题中,您询问如何插入空白行,但看起来好像您已经解决了这个问题。你还问效率,你是想减少重复代码还是提高性能?
  • 现在我有 15 个功能几乎完全相同。我想我只是想知道我是否可以将它们全部塞进一个函数中,而不是调用 15 个本质上做同样事情的不同函数。我编辑了上面的代码以反映我必须做的事情。
  • 您说您尝试组合成一个函数;你能分享你的尝试吗?
  • 我在主帖中提供了单一功能尝试。如果我删除 if flag:break 则整个工作表将变为空白行,并使用第一个 if 语句创建大量新工作表。
  • 无论cell.value 是什么,单个函数都会为第一个单元格设置flag=True。您是否尝试过使用 2 个字符串作为参数来编写函数?

标签: python excel openpyxl


【解决方案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,您可能不希望这样做。

【讨论】:

  • 实际上效果很好。我对编程很陌生,所以当你提到参数时,我感到很困惑。我现在明白了,你的解决方案奏效了。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-16
  • 2020-11-02
  • 1970-01-01
  • 2022-11-13
相关资源
最近更新 更多