首页 > 解决方案 > 有没有办法在 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从头开始创建文件,而不必依赖于现有文件.xlsmvbaProject.bin文件?与往常一样,正确、清楚解释的答案将被标记为已接受并被投票。

标签: python-3.xxlsm

解决方案


感谢 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=Trueload_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')

推荐阅读