将pandas数据框写入xlsm文件(启用宏的Excel)

2024-04-29 13:56:58 发布

您现在位置:Python中文网/ 问答频道 /正文

.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文件。

是否也可以将DataFrame写入.xlsmExcel文件?这实际上或多或少与.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 ^{} method建议这应该是可能的(请参见engine参数)。但是,我不知道如何实现这一点。

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

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 ^{} 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')也不能解决问题。


Tags: and文件thetodataframepandasdffor
1条回答
网友
1楼 · 发布于 2024-04-29 13:56:58

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部分。

相关问题 更多 >