Найти в Дзене
Записки сисадмина

Python. Исправляем ошибку чтения Excel файлов.

Сегодня хочу поговорить о насущной проблеме, с которой я сталкивался чаще, чем хотелось бы. В последние годы очень часто писал скрипты для формирования управленческих отчетов, отчетов по финансам, продажам и т.д. Большинство данных получал из excel файлов, сгенерированных 1С предприятием. Сам знаю, что корректнее получать json объект и работать уже с ним, но имеем что имеем. Тем более, некоторые руководители также загружали в обработку свои excel файлы. Так в чем проблема? А проблема в том, что python плохо воспринимает тот формат, который ему отдает windows и 1c. И каждый раз в момент открытия файла мы видим ошибку: KeyError: "There is no item named 'xl/sharedStrings.xml' in the archive" Если грубо - python не считает excel таблицу excel таблицей, т.к. в windows формате указанный в ошибке файл создается с заглавной буквы. Будем исправлять, но сначала немного погрузимся в теорию: Технически, xls формат отличается от xlsx тем, что xls - это таблица, а xlsx - это архив. Да, да, наш привы

Сегодня хочу поговорить о насущной проблеме, с которой я сталкивался чаще, чем хотелось бы. В последние годы очень часто писал скрипты для формирования управленческих отчетов, отчетов по финансам, продажам и т.д.

Большинство данных получал из excel файлов, сгенерированных 1С предприятием.

Сам знаю, что корректнее получать json объект и работать уже с ним, но имеем что имеем. Тем более, некоторые руководители также загружали в обработку свои excel файлы.

Так в чем проблема?

А проблема в том, что python плохо воспринимает тот формат, который ему отдает windows и 1c.

И каждый раз в момент открытия файла мы видим ошибку:

KeyError: "There is no item named 'xl/sharedStrings.xml' in the archive"

Если грубо - python не считает excel таблицу excel таблицей, т.к. в windows формате указанный в ошибке файл создается с заглавной буквы.

Будем исправлять, но сначала немного погрузимся в теорию:

Технически, xls формат отличается от xlsx тем, что xls - это таблица, а xlsx - это архив. Да, да, наш привычный Excel файл по сути является zip архивом, просто с немного другим форматом.

Именно поэтому защищенный паролем xlsx файл можно спокойно "взломать", распаковав его и убрав вручную параметры защиты с листа.

Но сейчас не об этом. Давайте разбираться с нашей проблемой.

  • Для работы нам понадобятся библиотеки shutil, os и zipfile:
import shutil
import os
from zipfile import ZipFile
  • Определяем нашу рабочую директорию и файл, с которым будем работать:
-2
  • Создаем папку для временных файлов:
-3
  • Так как наш Excel файл - это zip архив, распаковываем его во временную папку:
-4
  • Определяем неправильные пути:
-5
  • Исправляем название внутри распакованного файла и архивируем его обратно:
-6

На этом моменте все готово. Наши библиотеки получат возможность открывать файлы и обрабатывать их.

  • Обернем все в функцию, которую можно будет вызывать из других скриптов, заодно добавим функционал обработки всех .xlsx файлов в директории:
-7

Код из статьи выложил здесь.