首页 > 解决方案 > 除了openpyxl之外,有没有更快的方法来编辑xlsm文件?

问题描述

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 对其进行编辑。但有一个问题。当我尝试编辑具有 4 或 5 个模板的 xlsm 时,文件的大小为 4-5 mb,使用 openpyxl 时需要很长时间才能加载。有什么方法可以让我更快地修改当前文件而无需创建新文件?

标签: pythonxlsm

解决方案


一个.xlsxor.xlsm文件基本上是一堆封装在一个 zip 文件中的 XML 文件。

在我的脚本仓库中,我有一个示例 ( unlock-excel.py),我使用该zipfile模块打开和修改一个 Excel 文件。(在这种情况下,从页面中删除<sheetProtect>and<workbookProtect>元素)

我学到的关于创建这个程序的 excel 文件格式的知识记录在我网站上的这篇文章中。亮点:

xlsxxlsm)文件基本上是具有标准目录结构和大量 XML 文件的 zip 文件。在解压这些文件时,我一般会找到以下目录。

> 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.xmlcore.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 文本之后的编号。所以在上面的例子中,名为 template 的工作表是xl/worksheets/sheet1.xml.


推荐阅读