Python 将数据帧写入xlsm文件(启用宏的Excel)

Python 将数据帧写入xlsm文件(启用宏的Excel),python,excel,vba,pandas,Python,Excel,Vba,Pandas,以.xlsx格式将pandas.DataFrame写入Excel工作簿非常简单: import pandas as pd df = pd.DataFrame({'firstColumn' : [5, 2, 0, 10, 4], 'secondColumn' : [9, 8, 21, 3, 8]}) print(df) df.to_excel('test.xlsx') 其中: firstColumn secondColumn 0 5 9 1

.xlsx
格式将
pandas.DataFrame
写入Excel工作簿非常简单:

import pandas as pd
df = pd.DataFrame({'firstColumn' : [5, 2, 0, 10, 4], 'secondColumn' : [9, 8, 21, 3, 8]})
print(df)
df.to_excel('test.xlsx')
其中:

   firstColumn  secondColumn
0            5             9
1            2             8
2            0            21
3           10             3
4            4             8
以及相应的Excel文件

是否也可以将
数据框
写入
.xlsm
Excel文件?这实际上与
.xlsx
大致相同,但可以在文件中存储VBA宏。我需要这个,因为我想在创建文件后插入并运行VBA宏

但是,在常规
xlsx
文件上尝试此操作时,我会在弹出窗口中收到以下错误消息:

The following features cannot be saved in macro-free workbooks: VB project.
To save a file with these features, click No, and then choose a macro-enabled file type in the File Type list.
To continue saving as macro-free workbook, click Yes.
然后,我可以手动选择将文件保存为
.xlsm
,其中将包含我的宏。然而,我更愿意自动完成这项工作,而不需要额外的步骤

建议这应该是可能的(请参阅
发动机
参数)。但是,我不明白如何启用此功能

当我简单地将输出文件名更改为
*.xlsm
时,将创建一个名为
.xlsm
.xlsx
文件。当我试图打开它时,我会

Excel cannot open the file 'myFilename.xlsm' because the file format or file extension is not valid. Verify that the file has not been corrupted and that the file extension matches the format of the file.
如果我手动将扩展名更改为
.xlsx
,我可以再次打开它

关于:

openpyxl
:这包括对openpyxl 1.6.1的稳定支持(直到但不包括2.0.0),以及对openpyxl 2.0.0及更高版本的实验性支持`

我的
Openpyxl
版本是1.8.6。更新到2.1.4并没有解决问题。也没有将
XlsxWriter
从0.63更新到0.6.6


按照建议使用
df.to_excel('test.xlsx',engine='openpyxl')
也不能解决问题。

熊猫要求工作簿名称以
.xls
.xlsx
结尾。它使用扩展名选择要使用的Excel引擎

您可以传递一个临时名称,然后用如下内容覆盖它:

import pandas as pd

df = pd.DataFrame({'First' : [5, 2, 0, 10, 4], 
                   'Second' : [9, 8, 21, 3, 8]})

writer = pd.ExcelWriter('test.xlsx', engine='xlsxwriter')

df.to_excel(writer, sheet_name='Sheet1')

workbook  = writer.book
workbook.filename = 'test.xlsm'
# !! Won't load in Excel !!

writer.save()
这将创建一个扩展名为
.xlsm
的Excel文件

但是,由于名为“扩展强化”的功能,Excel不会打开此文件,因为它知道它不包含宏,实际上不是
xlsm
文件。(这是您在上面报告的Excel错误。)

通过从实际xlsm文件中提取
VbaProject.bin
宏文件并将其插入新文件,您可以在XlsxWriter的最新版本中解决此问题:

import pandas as pd

df = pd.DataFrame({'First' : [5, 2, 0, 10, 4], 
                   'Second' : [9, 8, 21, 3, 8]})

writer = pd.ExcelWriter('test.xlsx', engine='xlsxwriter')

df.to_excel(writer, sheet_name='Sheet1')

workbook  = writer.book
workbook.filename = 'test.xlsm'
workbook.add_vba_project('./vbaProject.bin')

writer.save()

有关更多信息,请参阅XlsxWriter文档的部分。

如果将文件名更改为
“test.xlsm”
,会发生什么情况?根据,
引擎
“默认为
io.excel..writer
”。哦,是的,我忘了提到。。。这将创建一个名为
xlsm
xlsx
文件。当我试图打开它时,由于文件格式或文件扩展名无效,Excel无法打开文件“myFilename.xlsm”。验证文件是否已损坏,以及文件扩展名是否与文件格式匹配。
如果我手动将扩展名更改为
xlsx
,我可以再次打开它。请编辑问题以包含此信息和任何其他相关信息。您是否尝试过指定
engine='openpyxl'
?没有,没有其他错误-在命名文件
xlsm
时,我得到一个扩展名错误的
xlsx
文件。通过简单地命名文件
xlsm
并选择正确的引擎,它对您有用吗?如果没有,那么我想pandas的文档在这方面有点过于简化,特别是关于jmcnamara下面的(更复杂的)建议,它起到了作用。我这里没有安装
pandas
,我只是想鼓励您提供所有适当的故障排除信息。不过,很高兴你找到了一个有效的答案。这太棒了!顺便说一下,我无法运行您在文档中提到的
vba_extract.py
脚本-源代码看起来像HTML文件,导致语法错误?或者它应该如何使用?但是,也可以简单地将
xlsm
文件重命名为
zip
,使用任何存档工具打开它,然后从
xl
文件夹中提取
vbaProject.bin
文件。确保
xlsm
文件至少包含一个宏,否则将不存在此类文件。安装XlsxWriter时,生成系统/打包程序应将
vba_extract.py
实用程序安装到路径中。如果没有,它也包含在存储库的examples目录中。如果我试图将数据帧写入一个已经有很多宏的现有工作表(xlsm),该怎么办。它会“损坏”我现有的文件吗?我会丢失宏吗?对于希望将启用宏的新文件保存到其他位置的人,只需给出文件名的完整路径即可。示例:workbook.filename='/path/of/your/choice/filename.xlsm'