Некоторые из моих пользователей (все из которых используют Ma c) загрузили Excel в мое приложение, которое затем отклонило его, поскольку файл оказался пустым. После некоторой отладки я определил, что файл был сохранен в формате таблицы Strict Open XML Spreedsheet, и что openpyxl (2.6.0) не выдает ошибку, а выводит предупреждение на stderr.
Для воспроизведения откройте файл, добавьте несколько строк и сохраните его в формате Strict Open XML Spreedsheet (* .xlsx).
import openpyxl
with open('excel_open_strict.xlsx', 'rb') as f:
workbook = openpyxl.load_workbook(filename=f)
Это выведет следующее предупреждение, но не вызовет никаких исключений :
UserWarning: File contains an invalid specification for Sheet1. This will be removed
Более того, в книге нет листов:
assert workbook.get_sheet_names() == []
У меня уже три пользователя Ma c столкнулись с этой проблемой. Кажется, что Ma c иногда по умолчанию использует этот формат таблицы Strict Open XML Spreedsheet. Если это нормальный случай, openpyxl должен справиться с этим. В противном случае было бы здорово, если бы openpyxl просто выдал исключение. В качестве обходного пути я могу сделать следующее:
import openpyxl
with open('excel_open_strict.xlsx', 'rb') as f:
workbook = openpyxl.load_workbook(filename=f)
if not workbook.get_sheet_names():
raise Exception("The Excel was saved in an incorrect format")