微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python – 将pandas数据帧写入xlsm文件(启用了宏的Excel)

将pandas.DataFrame写入.xlsx格式的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文件.

是否有可能将DataFrame写入.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,这将包含我的宏.但是,如果没有额外的步骤,我宁愿自动执行此操作.

documentation for the to_excel method表明这应该是可能的(参见引擎参数).但是,我不明白如何启用它.

当我只是将输出文件名更改为* .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,我可以再次打开它.

关于this part of the pandas documentation

openpyxl: This includes stable support for OpenPyxl 1.6.1 up to but not including 2.0.0, and experimental support for OpenPyxl 2.0.0 and later.`

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

如建议使用df.to_excel(‘test.xlsx’,engine =’openpyxl’)也没有解决问题.

解决方法:

Pandas要求工作簿名称以.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文档的Working with VBA Macros部分.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐