-2

我在获取以下输出的代码时遇到问题:

回溯(最后一次调用):
文件“1stHour.py”,第 48 行,在
ws1.cell(column=1, row=i, value="%s" % blue_student_list[i])
IndexError: list index out of range `

# coding=utf:8
from pythonzenity import Message
from openpyxl.styles import PatternFill
from openpyxl import Workbook
import bluetooth
import time



def student_check(index):
    result = bluetooth.lookup_name(blue_address_list[index], timeout=3)
    if (result is not None):
        return True
    else:
        return False

blue_student_list = ['Name', 'Name2']
blue_address_list = ['Address', 'Address2']


redFill = PatternFill(start_color='FF0000', end_color='FF0000', fill_type='solid')
greenFill = PatternFill(start_color='00FF00', end_color='00FF00', fill_type='solid')


for i in range(0, len(blue_address_list)):

    i = i + 1

    ws1.cell(column=1, row=i, value="%s" % blue_student_list[i])
    if (student_check(i)):
       ws1.cell(column=2, row=i, value="%s" % "Present").fill = greenFill
    else:
       ws1.cell(column=2, row=i, value="%s" % "Absent").fill = redFill


Message(title="Attendance Checker",text="You can now open the Excel Document on your Desktop", timeout=3000)

我有这个工作但忘记保存它,所以我没有正确的方法我以前在这里了。我能做些什么来防止这个错误?我觉得我忘记了一些东西或i = i + 1在我的代码中写了一些东西。

4

2 回答 2

1

行和列在 openpyxl 中是 1 索引的,因此ws['A1']对应于ws.cell(column=1, row=1).

IndexError几乎可以肯定来自查找blue_student_list[i]。最好使用额外的行来获取值并避免使用“%s”格式,因为这里完全没有必要。

for idx, value in enumerate(blue_student_list, start=1):
    ws1.cell(column=1, row=idx, value=value)
于 2016-03-24T17:31:16.963 回答
1

当你这样做时:

for i in range(0, len(blue_address_list)):

也不需要这样做:

i = i + 1

这样做会导致您看到的错误类型。

您似乎正在这样做,因为您使用的库使用基于 1 的索引,而不是 Python 列表中的基于 0 的索引。i但是当你这样做时,你仍然使用 (1 too high)来索引列表:

blue_student_list[i]

因此,与其第二次递增i,不如将一个高 1 的值传递给需要它的事物:

ws1.cell(column=1, row=i+1, value="%s" % blue_student_list[i])

同样在其他调用ws1.cell.

这对于一个 Python 库来说是不寻常的,至少可以说,所以它可能需要在你第一次使用之前发表这样的评论row=i+1

# Need row=i+1 because openPyXML uses 1-based indexing
于 2016-03-24T14:20:52.190 回答