簡體   English   中英

無法刪除具有特定單元格值的行python openpyxl

[英]Unable to remove rows with specific cell value python 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列組成,ABCDE第一行具有標題,因此可以忽略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行和ABCDE列,但是腳本只刪除了值為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")

它不漂亮,所以任何提示將不勝感激

您可以嘗試如下操作:

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文件,其中已刪除enabled列中所有包含FALSE行。

它首先為每一行創建一個字典,如果已enabled的鍵設置為True ,則保留該行。 最后,它遍歷所有行並將它們分別寫回到輸出文件。

我認為這是縮進的問題,請嘗試以下操作:

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 ,這意味着將行從最后一行迭代到第一行(這樣,當刪除一行時,其余行將不會受到影響),並且有必要中斷內部循環(由於循環行被刪除,您不能再循環該行)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM