如何在 openpyxl 中使用 if 语句停止打印

How to stop printing using if statement with openpyxl

我正在从 excel 工作簿中读取值,并且我试图在特定单元格的值等于字符串时停止打印。这是我的代码

import openpyxl
wb = openpyxl.load_workbook('data.xlsx')

for sheet in wb.worksheets:
    nrows = sheet.max_row
    ncolumns = sheet.max_column
    for rowNum in range(20,sheet.max_row):
        Sub = sheet.cell(row=rowNum, column=3).value
        Unit = sheet.cell(row=rowNum, column=6).value
        Concentration = sheet.cell(row=rowNum, column=9).value
        com = rowNum[3]
        if Sub == "User:":
            pass
        else:
            print(Sub, Concentration, Unit)

问题是 if 语句不起作用。当我使用 type(Sub) 时,python return <type 'unicode'>

你知道怎么做吗?

谢谢

听起来你的测试失败了。 Excel 文件中的所有字符串都作为 unicode 对象返回,但 "User:" == u"User:"。也许您正在查看的单元格有一些在您的调试语句中不可见的空白。在这种情况下,在打印时将字符串嵌入到列表中很有用 print([Sub])

或者,看起来是这种情况,您在 Excel 的基于 1 的索引和 Python 的基于零的索引之间感到困惑。在您的代码中,要查看的第一个单元格将是 C20 (ws.cell(20, 3)) 但 rowNum[3] 实际上是 D20.

我还建议您尽量避免使用 Python 的 range 以及 max_columnmax_row 属性,除非您真的需要它们。在您的情况下, ws.get_squared_range() 更有意义。或者,在 openpyxl 2.4 中,它允许指定一系列单元格的已知边缘。

for row in get_squared_range(ws.min_colum, 20, ws.max_column, ws.max_row):
    Sub = row[2].value # 3rd item
    Unit = row[5].value
    Concentration = row[8].value

在openpyxl 2.4中get_squared_range可以替换为:

for row in ws.iter_rows(min_row=20):