python-3.x - 有没有办法在 python 中从头开始创建一个 .xlsm 文件?
问题描述
我在 Mac 上使用 python 3.8.1 并尝试.xlsm
从头开始创建文件。我查看了 openpyxl 和 xlsxwriter,它们都能够.xlsx
从头开始创建文件,并且都可以编辑现有.xlsm
文件,但我找不到任何关于.xlsm
从头开始实际创建文件的信息。
我查看了此处的 openpyxl 文档和此处的 xlsxwriter 文档,但我无法找到有关如何.xlsm
从头开始创建文件的任何信息。我什至找不到有关如何将.xlsx
文件转换为文件的任何信息.xlsm
。
我最接近的是你可以使用vba_extract.py
它包含在 xlsxwritervbaProject.bin
从现有.xlsm
文件中提取一个命名的文件,然后你可以将它添加到一个.xlsx
文件中,然后你可以将它保存为一个.xlsm
文件,但我需要创建一个.xlsm
文件从头开始,而不是依靠那里有一些文件来创建它。
openpyxl、xlsxwriter 或任何其他我可以与 python 3.8.1 一起使用的实用程序是否有任何东西可以.xlsm
从头开始创建文件,而不必依赖于现有文件.xlsm
或vbaProject.bin
文件?与往常一样,正确、清楚解释的答案将被标记为已接受并被投票。
解决方案
感谢 Alexander Pushkarev 和 APhillips 帮助解决这个问题。离开亚历山大的帖子,我能够想出一个技巧来让它工作。我对此并不感到自豪,但它确实有效。
运行 Alexander 的代码我得到这个错误:
异常被忽略: Traceback(最近一次调用最后):文件“/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/zipfile.py”,第 1819 行,在del self.close() 文件中“ /Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/zipfile.py",第 1836 行,关闭 self.fp.seek(self.start_dir) ValueError:对已关闭文件的 I/O 操作。
我玩弄了这个,发现如果我keep_vba=True
从load_workbook
函数中取出代码会运行,但是在尝试.xlsm
使用 Excel 打开文件时仍然出现上面提到的错误。
所以,查看最新的错误,我看到最后一行说
对已关闭文件的 I/O 操作。
我查看了 openpxyl 文档并尝试在没有keep_vba=True
选项的情况下打开文件,然后再使用它打开它keep_vba=True
并且它有效。
所以请原谅这个丑陋的代码,但这可以.xlsm
从头开始创建一个文件,而不依赖于任何现有文件(复制和粘贴准备好):
from openpyxl import Workbook
from openpyxl import load_workbook
wb = Workbook()
ws = wb.active
ws['A1'] = 42
ws.append([1, 2, 3])
wb.save('new_document.xlsm')
wb1 = load_workbook('new_document.xlsm')
wb2 = load_workbook('new_document.xlsm', keep_vba=True)
wb2.save('new_document.xlsm')
推荐阅读
- javascript - 如何使用 CSS 对齐一行中的项目?
- java - 如果我们在 Google Cloud Platform 中部署了 Spring Boot 应用程序,如何查看日志?
- javascript - 为什么用case和union选择会返回一个带有节点和sqlite的空数组
- python - Python 日期之间的差异 np 数组 - 当前日期
- ios - 在适用于 iOS 12 的 Swift 4、Xcode 10 中启用 WKWebView 的缩放
- java - 你能帮我用一种方法来计算同一楼层所有房间的面积吗?
- android - Firebase 身份验证失败
- mongodb - Mongo docker image - 无法在不同的端口上运行
- tableau-api - 在 Tableau 中根据字符串对条目进行分类和过滤
- javascript - 如何使用选择标签有条件地渲染三个组件之一?