Файл .xlsx
или .xlsm
- это, по сути, набор файлов XML, упакованных в zip-файл.
В моем репозитории сценариев у меня есть пример (unlock-excel.py
) где я использую модуль zipfile
для открытия и изменения файла Excel. (В этом случае удаление элементов <sheetProtect>
и <workbookProtect>
со страниц)
То, что я узнал о формате файлов Excel для создания этой программы, описано в этой статье на моем веб-сайте. , Основные моменты:
Файл xlsx
(или xlsm
) в основном представляет собой zip-файл со стандартной структурой каталогов и набором XML файлов. При распаковке этих файлов я обычно находил следующие каталоги:
> mkdir foo
> cd foo
> unzip ../foo.xlsx
> find . -type d|sort
.
./_rels
./docProps
./xl
./xl/_rels
./xl/printerSettings
./xl/theme
./xl/worksheets
./xl/worksheets/_rels
Каталоги _rels
не имеют значения для этой цели.
Каталог docProps
содержит два файла; app.xml
и core.xml
. Файл app.xml
в основном содержал список заголовков, как видно на вкладках в нижней части рабочих листов. Названия перечислены в этом файле в той последовательности, в которой они отображаются в файле xlsx слева направо. Они заключены в скобки между тегами <vt:lpstr>
и </vt:lpstr>
.
Файл workbook.xml
в каталоге xl
содержит несколько определений листа. Они связывают название листа с несколькими номерами. На каждом листе есть один тег с атрибутами, например:
<sheet name="template" sheetId="4" r:id="rId1"/>
В подкаталоге xl/worksheets
имеется ряд XML файлов с именем sheetN.xml
, где N
- это число. Это настоящие рабочие листы. Можно ожидать, что N соответствует sheetId. Но оказывается, что это не так. Номер листа N на самом деле является номером в атрибуте r: id после текста rId. Таким образом, в приведенном выше примере лист с именем шаблона равен xl/worksheets/sheet1.xml
.