python - 除了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 时需要很长时间才能加载。有什么方法可以让我更快地修改当前文件而无需创建新文件?
解决方案
一个.xlsx
or.xlsm
文件基本上是一堆封装在一个 zip 文件中的 XML 文件。
在我的脚本仓库中,我有一个示例 ( unlock-excel.py
),我使用该zipfile
模块打开和修改一个 Excel 文件。(在这种情况下,从页面中删除<sheetProtect>
and<workbookProtect>
元素)
我学到的关于创建这个程序的 excel 文件格式的知识记录在我网站上的这篇文章中。亮点:
(xlsx
或xlsm
)文件基本上是具有标准目录结构和大量 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.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 文本之后的编号。所以在上面的例子中,名为 template 的工作表是xl/worksheets/sheet1.xml
.
推荐阅读
- html - 我使用引导程序的切换选项卡不起作用
- javascript - 生成的源图有误
- javascript - ServiceNow - 查询表和插入事件
- java - MediaPlayer 不播放声音
- apache-spark - 根据另一列的元素从 pyspark 数组中删除元素
- django - 如何修复列表视图未在 Django 中显示
- mysql - 如何使用相同的代码获取表中的计数?
- ruby-on-rails - 编辑表单输入未出现在非持久化数据中
- d3.js - D3 根据条件填充不同颜色的区域
- reactjs - 使用 Redux 和 Redux-Observable 中间件处理异步 Http 请求的经验