【问题标题】:Python openpyxl read until empty cellPython openpyxl 读取直到空单元格
【发布时间】:2018-03-19 14:59:28
【问题描述】:

我试图从我的 Excel 文件中读取一列,直到它碰到一个空单元格,然后它需要停止读取。 到目前为止我的代码:

import openpyxl
import os

def main():
    filepath = os.getcwd() + "\test.xlsx"

    wb = openpyxl.load_workbook(filename=filepath, read_only=True)
    ws = wb['Tab2']

    for i in range(2, 1000):
        cellValue = ws.cell(row=i, column=1).Value
        if cellValue != None:
            print(str(i) + " - " + str(cellValue))
        else:
            break;

if __name__ == "__main__":
    main() 

通过运行它,当它碰到一个空单元格时,我会收到以下错误。有谁知道我可以如何防止这种情况发生。

Traceback (most recent call last):
  File "testFile.py" in <module>
      main()
      cellValue = sheet.cell(row=i, column=1).value
  File "C:\Python34\lib\openpyxl\worksheet\worksheet.py", line 353, in cell
      cell = self._get_cell(row, column)
  File "C:\Python34\lib\openpyxl\worksheet\read_only.py", line 171, in _get_cell
      cell = tuple(self.get_squared_range(column, row, column, row))[0]
IndexError: tuple index out of range

【问题讨论】:

    标签: python excel python-3.x openpyxl


    【解决方案1】:

    尝试使用 max_row 来获取最大行数。

    from openpyxl import Workbook
    from openpyxl import load_workbook
    
    wb = load_workbook('exc_file.xlsx')
    ws1 = wb['Sheet1']
    for row in range(1,ws1.max_row):
        if(ws1.cell(row,1).value is not None):
                print(ws1.cell(row,1).value)
    

    或者如果你想在它达到一个空值时停止阅读,你可以简单地:

    from openpyxl import Workbook
    from openpyxl import load_workbook
    
    wb = load_workbook('exc_file.xlsx')
    ws1 = wb['Sheet1']
    for row in range(1,ws1.max_row):
        if(ws1.cell(row,1).value is None):
            break
        print(ws1.cell(row,1).value)
    

    【讨论】:

    • 如果我尝试你的第二个想法,我会得到以下错误AttributeError: 'int' object has no attribute 'upper',它指向if(sheet.cell(row+1,1).value is None
    • 现在试试吧,我修复了 (+1) 问题,因为我有点误用了 range 函数。还有你想读取什么数据。
    【解决方案2】:

    这说明了我不鼓励使用ws.cell() 阅读工作表的原因之一。使用更高级别的 API ws.iter_rows() 会更好(出于性能原因,ws.iter_cols() 在只读模式下是不可能的。

    for row in ws.iter_rows(min_col=1, max_col=1):
        if row[0].value is None:
            break
        print("{0}-{1}".format(row[0].row, row[0].value))
    

    iter_rows 应该保证到达行中总是有一个单元格。

    【讨论】:

    • 这告诉我`类型错误:iter_rows() 得到了一个意外的关键字参数'min_col'`
    • 按照你不能给min_colmax_col作为参数的文档。只有range_stringrow_offsetcolumn_offset
    • cell[0] 应该是 row[0] 吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-05
    • 1970-01-01
    • 1970-01-01
    • 2019-07-08
    • 1970-01-01
    • 2021-02-23
    相关资源
    最近更新 更多