Есть ли способ быстрее редактировать файл xlsm, кроме openpyxl? - PullRequest
0 голосов
/ 19 апреля 2020
file='excel.xlsm'
wb=openpyxl.load_workbook(filename=file, read_only=False, keep_vba=True)
sheet=wb['Template']
rowx=['x','y','z']
rows=sheet.max_row
sheet.cell(row=rows+1, column=j+1).value=row[j]
wb.save(file)

У меня есть файл xlsm, и я попытался отредактировать его с помощью openpyxl. Но существует проблема. Когда я пытаюсь отредактировать xlsm, который имеет 4 или 5 шаблонов, размер файла составляет 4-5 мегабайт, что занимает много времени для загрузки при использовании openpyxl. Есть ли способ, которым я могу изменить свой текущий файл быстрее, не создавая новый?

1 Ответ

0 голосов
/ 19 апреля 2020

Файл .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.

...