首页 > 解决方案 > xlsxwriter 在“thisworkbook”上添加一个宏以在打开时执行

问题描述

我已经从代码在 Thisworkbook 中的 XMLS 中提取了 bin 文件,因为我需要在打开文件时运行宏我无法使用以下代码创建一个 XLSM,它在打开时执行代码:创建的 XLSM 具有“ Thisworkbook”和“Thisworkbook1”,并且代码在打开时未运行

import xlsxwriter


strn =" Feb "
## Region Level

Loc = Location.reset_index()


for n, g in Matrix.groupby('Cluster'):

    out_path = "D:/Actions/Results/Action-Opp "  + n.strip(" ") +  strn + ".xlsx" 
    writer = pd.ExcelWriter(out_path , engine='xlsxwriter')

    C =Loc[Loc.Cluster==n].iloc[:,1:]
    B =SPs[SPs.Cluster==n]
    D = PDet[PDet.Cluster==n]
    F = OppD[OppD.Cluster==n]

    Total.iloc[:,:-2].to_excel(writer, sheet_name="Region",   index=True) 
    C.to_excel(writer, sheet_name="Stores", index=False)
    B.to_excel(writer, sheet_name="SPs", index=False)
    D.to_excel(writer, sheet_name="Portfolio Details",   index=False)

    F.to_excel(writer, sheet_name="Opportunity Details",  index=False)

    workbook  = writer.book
    workbook.filename = "D:/Actions/Results/Action-Opp "  + n.strip(" ") +  strn + ".xlsm" 
    worksheet1 = writer.sheets['Region']
    worksheet2 = writer.sheets['Stores']
    worksheet3 = writer.sheets['SPs']
    workbook.set_vba_name('Stores')
    workbook.add_vba_project('D:/Actions/vbaProject.bin')

    writer.save()


elapsed = timeit.default_timer() - start_time
print(elapsed)

标签: excelpandasxlsxwriter

解决方案


这是创建一个 xlsm 文件的方法,该文件将包含一个宏,该宏将在您每次打开工作簿时自动运行(只要文件的文件夹设置为受信任的位置):

1)创建一个excel文件,插入一个新模块并输入这个vba代码:

Sub Auto_Open()
    MsgBox "Hello World!"
End Sub

将文件另存为 xlsm。

2) 使用 xlsxwriter 的 vba_extract.py 实用程序提取 vba 代码。

3)运行以下python脚本:

import xlsxwriter

# Create a workbook and add a worksheet.
workbook = xlsxwriter.Workbook('test.xlsx')
workbook.filename = 'test.xlsm'
worksheet = workbook.add_worksheet()

# Inject the bin file we extracted earlier
workbook.add_vba_project('./vbaProject.bin')

# Finally write the file
workbook.close()

这将创建一个文件,其中注入了宏,并在您每次打开它时自动运行。

输出: 在此处输入图像描述

如果您仍然遇到问题,我建议您检查两件事:首先,如果您的宏以关键字开头,Sub Auto_Open()其次您是否已将打开文件的文件夹设置为受信任位置(因为默认情况下,办公应用程序将阻止来自运行以防它们包含恶意代码)。


推荐阅读