无法删除具有特定单元格值的行python openpyxl

时间:2018-07-25 04:12:08

标签: python excel openpyxl

我遇到一个奇怪的问题,即逻辑和代码告诉我它应该可以工作,但是不能。

我的代码在

下方
import shutil, sys
from distutils.version import StrictVersion
import openpyxl
from openpyxl import Workbook
from openpyxl import load_workbook

wb = load_workbook('testing.xlsx')
ws = wb.get_sheet_by_name('Sheet1')
x = ws.max_row
y = ws.max_column

for r in range(1,x+1):
        for j in range(1, y+1):
                d=ws.cell(row=r,column=j)
        if str(d.value).lower() == "false":
                ws.delete_rows(r)

wb.save("test_1.xlsx")

excel由5列A B C D E组成 第一行有标题,因此可以忽略 A2有时间,B2有名称C2有用户名,D2路径,E2包含TRUE或FALSE值

我的脚本的重点是查看所有单元格,如果找到FALSE的值,它将删除该行。 例如第10行

1999年1月1日John Smith JohnS / path / FALSE 应该将其删除,因为它包含FALSE,或更具体地说E10具有FALSE。 TRUE FALSE值仅出现在E列中,因此为了提高速度,我们可以指定仅对E列感兴趣,而对任何行都感兴趣。我已经在其他版本中做到了。

解决问题 问题是如上所述,我的测试excel总共有25行A B C D E列,但脚本仅删除了值为FALSE的5行。同样,脚本似乎随机删除了包含FALSE的行,因此在我的测试excel中,共有10行带有FALSE单元格。 用户名顺序为 t1,t2,t3,t4,t5,t6,t7,t8,t9,t10 但是该脚本刚刚被删除 t1,t3,t5,t6,t7,t9 现在看来,我似乎对逻辑及其检查奇数有疑问

编辑 看来,如果我重复循环多次,它将删除所有包含FALSE的行

当前有效的代码

import shutil, sys
from distutils.version import StrictVersion
import openpyxl
from openpyxl import Workbook
from openpyxl import load_workbook

wb = load_workbook('testing.xlsx')
ws = wb.get_sheet_by_name('Sheet1')
x = ws.max_row
y = ws.max_column

for r in range(1,x+1):
        for j in range(1, y+1):
                d=ws.cell(row=r,column=j)
        if str(d.value).lower() == "false":
                ws.delete_rows(r)


for r in range(1,x+1):
        for j in range(1, y+1):
                d=ws.cell(row=r,column=j)
        if str(d.value).lower() == "false":
                ws.delete_rows(r)

for r in range(1,x+1):
        for j in range(1, y+1):
                d=ws.cell(row=r,column=j)
        if str(d.value).lower() == "false":
                ws.delete_rows(r)

for r in range(1,x+1):
        for j in range(1, y+1):
                d=ws.cell(row=r,column=j)
        if str(d.value).lower() == "false":
                ws.delete_rows(r)

wb.save("test_1.xlsx")

它不太漂亮,所以任何提示都会受到赞赏

2 个答案:

答案 0 :(得分:0)

您可以尝试以下操作:

from openpyxl import load_workbook
from openpyxl.workbook import Workbook

# open workbook and get active worksheet
wb = load_workbook('original.xlsx')
ws = wb.active

# extract headers from row 1
headers = [cell.value for row in ws.iter_rows(min_row=1, max_row=1) for cell in row]

# want to keep headers by default
new_rows = [headers]

# go through every row(>=2) except headers
for row in ws.iter_rows(min_row=2):
    values = [cell.value for cell in row]

    # create dictionary of row 
    row_dict = dict(zip(headers, values))

    # only append if 'enabled' is True
    if row_dict['enabled']:
        new_rows.append(values)

# create a new workbook and sheet to write to
new_wb = Workbook()
new_ws = new_wb.active

# iterate though rows and columns of nested list
for row, line in enumerate(new_rows, start=1):
    for column, cell in enumerate(line, start=1):

        # write new cell to output worksheet
        new_ws.cell(row=row, column=column).value = cell

# save output workbook
new_wb.save('output.xlsx')

其中给出了一个新的 output.xlsx 文件,其中删除了FALSE列中包含enabled的所有行。

它首先为每一行创建一个字典,如果键enabled设置为True,请保留该行。最后,它遍历所有行并将它们分别写回到输出文件。

答案 1 :(得分:0)

我认为这是缩进的问题,请尝试以下操作:

import shutil, sys
from distutils.version import StrictVersion
import openpyxl
from openpyxl import Workbook
from openpyxl import load_workbook

wb = load_workbook('testing.xlsx')
ws = wb.get_sheet_by_name('Sheet1')
x = ws.max_row
y = ws.max_column

for r in range(1,x+1):
    for j in range(1, y+1):
        d=ws.cell(row=x+1-r,column=j)
        if str(d.value).lower() == "false":
            ws.delete_rows(x+1-r)
            break

wb.save("test_1.xlsx")

,然后将行号从r更改为x+1-r,这意味着从最后一行到第一行进行迭代(这样,当删除一行时,其余行将不受影响),并且有必要中断内部循环(由于删除了循环行,因此无法再循环此行)