【问题标题】:Can't get OpenPyXl to delete rows无法让 OpenPyXl 删除行
【发布时间】:2018-11-19 14:20:51
【问题描述】:

我正在使用 Python 和 OpenPyXL 合并两个 Excel 报告。 当报表有一行全为零时,应删除该行。

删除行的命令看起来很简单,但它根本不起作用。 Another post 建议删除行不适合 append。我没有使用这个功能,但也许还有其他挑剔的地方?

我正在处理打开和保存操作组的 Excel 文件。这是我删除这些行的块的注释代码版本。

# Get WB
# Get WS
i = 0
del_rows = []
for row in ws.iter_rows():
    i += 1
    if row[0].value is None:
        # INVALID DATA ROW - BLANK ROW
    else:
        rowcellvals = []
        j = 0
        for cell in row:
            j += 1
            if cell.value == row[0].value:
                # INVALID COLUMN VAL - SKIP ACC NAME COL
                continue
            elif cell.value is None:
                # SKIP TITLE ROWS
                break
            else:
                # VALID DATA ROW
                if j % 2 == 0:
                    rowcellvals.append(cell.value)

        if not rowcellvals:
            continue
        else:
            if sum(rowcellvals) == 0:
                del_rows.append(i)

for r in del_rows:
       ws.delete_rows(r, 1)

# SAVE

任何想法为什么删除行不删除?

【问题讨论】:

  • 不要在循环中使用delete_rows,或者如果使用,请反转它。
  • 反转它?我不熟悉这样的 Python 习语。
  • 阅读range,查看带有负步骤的示例。

标签: python openpyxl


【解决方案1】:

因为您要从工作表顶部删除行,所以您正在调整行索引。这意味着一旦您删除了一行,您要删除的所有其他行的索引都是错误的。为避免这种情况,您应该始终从工作表底部删除行。

for r in reversed(del_rows):
    ws.delete_rows(r)

【讨论】:

  • 如果要删除的行与要保留的行交错放置,则仅反转要删除的行列表是不够的。
  • 当然会。
  • 是的,你是对的,自从发表评论后就意识到了这一点。我收回我的评论并声称相反。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-04
  • 1970-01-01
  • 2020-12-24
  • 2020-12-11
  • 2012-02-11
相关资源
最近更新 更多