перебор всех строк / столбцов openpyxl больше не работает с новой версией> 2.3.5

#excel #python-3.x #pydev #openpyxl

#excel #python-3.x #pydev #openpyxl

Вопрос:

с версией 2.3.5 openpyxl этот код работает:

 from openpyxl import load_workbook

excel_file = load_workbook(excel_file_path,read_only=True)

sheet = excel_file["Sheet1"]

    mylist = []
    for row in sheet:
        for cell in row:
            mylist.append((cell.value, cell.row, cell.column))
  

я сделал это, чтобы быстрее обрабатывать свой большой файл Excel. но с новой версией, начиная с 2.4.x, это больше не работает, первый «цикл for» немедленно прерывается, что изменилось в версии? или как я могу сделать то же самое с последней версией openpyxl?

Комментарии:

1. Что вы имеете в виду под «перерывами»? Пожалуйста, предоставьте полную обратную трассировку.

2. я имею в виду, что он даже не выполняет первый цикл, он просто переходит к следующей строке кода, первый «for-loop» даже не введен

3. Это происходит с новой версией в любое время, когда я устанавливаю read_only True . В противном случае все в порядке.

4. Ну, это может быть плохой файл. Не могу сказать, не видя этого, но код здесь не изменился.

5. @CharlieClark, я только что протестировал это на более чем 5 файлах Excel. Он ведет себя так же (работает, когда read_only = False , но не когда read_only = True ).

Ответ №1:

Похоже, это происходит только тогда, когда у вас установлен read_only параметр True при загрузке рабочей книги. Мой обходной путь заключался в использовании max_row атрибута sheet для создания range значений для перебора в качестве индексов строк:

 from openpyxl import load_workbook

excel_file = load_workbook(excel_file_path,read_only=True)
sheet = excel_file["Sheet1"]

mylist = []
row_num = sheet.max_row

for row_index in range(1,row_num):
    for cell in sheet[row_index]:
        mylist.append((cell.value, cell.row, cell.column))
  

Надеюсь, @CharlieClark сможет пролить некоторый свет на это. Но в то же время я надеюсь, что это полезно.

Комментарии:

1. спасибо, я попробовал, это действительно обходной путь, который работает с новой версией, но все же было бы неплохо узнать, что изменилось и почему приведенный выше код не работает с последней версией