openpyxl не может прочитать Strict Open XML Формат электронной таблицы: UserWarning: файл содержит недопустимую спецификацию для Sheet1. Это будет удалено - PullRequest
0 голосов
/ 08 июля 2020

Некоторые из моих пользователей (все из которых используют 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")

1 Ответ

0 голосов
/ 17 июля 2020

У меня были похожие проблемы с файлами XLSX, созданными с помощью библиотеки R openxlsx. Пример сообщения об ошибке от простой программы python для открытия файла и получения единственного значения из листа Обрезки:

Предупреждение (из модуля предупреждений): Файл "C: \ Python38 \ lib \ site- packages \ openpyxl \ reader \ workbook.py ", строка 88 предупреждение (msg) UserWarning: файл содержит недопустимую спецификацию для сельскохозяйственных культур. Он будет удален.

Мое первое, очень неуклюжее решение:

  1. Открыть в Excel
  2. Сохраните файл как * .xls, который вызвало предупреждение о совместимости.
  3. Повторно сохранить как * .xlsx

Мое второе решение работает, если вам нужно только прочитать файл:

  1. Установить ограничение только для чтения: wb = load_workbook(filename = 'CAF_LTAR_crops_out_0.3.xlsx', read_only=True)

Общий урок, по-видимому, заключается в том, что спецификация файла XLSX не одинаково (правильно?) Реализована для разных языков программирования.

...