Добавьте фрейм данных и кнопку на один лист с помощью XlsxWriter - PullRequest
1 голос
/ 11 марта 2020

Я могу создать файл Excel, содержащий на одном листе данные из фрейма данных, а на втором листе кнопку для запуска макроса лист

Код, который я нашел и пытался изменить:

import pandas as pd
import xlsxwriter

df = pd.DataFrame({'Data': [10, 20, 30, 40]})

writer = pd.ExcelWriter('hellot.xlsx', engine='xlsxwriter')
worksheet = workbook.add_worksheet()
#df.to_excel(writer, sheet_name='Sheet1')

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

worksheet.write('A3', 'Press the button to say hello.')

#Add a button tied to a macro in the VBA project.
worksheet.insert_button('A1', {'macro':   'start',
                              'caption': 'Press Me',
                              'width':   80,
                              'height':  30})

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

writer.save()


workbook.close()

1 Ответ

1 голос
/ 12 марта 2020

Я знаю, что вы просто спросили, как вставить кнопку в тот же лист, но я решил проверить, как макросы работают с xlsxwriter, поэтому я написал полное руководство по добавлению макроса.

1) Во-первых, нам нужно вручную создать файл, который будет содержать макрос, чтобы извлечь его как двоичный файл и внедрить его позже, используя xlsxwriter. Таким образом, мы создаем новый файл Excel, go на вкладке Разработчик, Visual Basi c, Вставляем модуль и пишем следующий код:

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

Сохраняем файл с расширением xlsm, чтобы содержать макрос, например as Book1.xlsm.

2) Теперь нам нужно извлечь файл bin. Откройте ваш cmd и перейдите в каталог, где вы сохранили Book1.xlsm. Затем просмотрите проводник в папку, в которую вы установили python (или в папку виртуальной среды), и найдите vba_extract.py. Скопируйте этот скрипт в ту же папку, что и Book1.xlsm. Затем введите cmd:

python vba_extract.py Book1.xlsm

Таким образом, вы извлечете макрос и создадите файл vbaProject.bin в той же папке.

3) Теперь пришло время создать окончательный файл. Удалите файлы Book1.xlsm и vba_extract.py, поскольку они больше не нужны, и запустите следующий код:

import pandas as pd

# Create a test dataframe
df = pd.DataFrame({'Data': [10, 20, 30, 40]})

# Import it through the xlsxwriter
writer = pd.ExcelWriter('hello_world.xlsx', engine='xlsxwriter')
df.to_excel(writer, sheet_name='Sheet1', index=False)

# Create the workbook and the worksheet
workbook = writer.book
workbook.filename = 'hello_world.xlsm' # rename the workbook to xlsm extension
worksheet = writer.sheets['Sheet1']

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

# Insert a description
worksheet.write('B1', 'Press the button to say hello.')

#Add a button tied to a macro in the VBA project.
worksheet.insert_button('B2', {'macro': 'TestMsgBox',
                              'caption': 'Press Me',
                              'width': 80, 'height':  30})

# Finally write the file
writer.save()

Кнопка «Сейчас» находится на том же листе, что и ваши данные, и работает:

enter image description here

...