python與macro宏調用

1、簡單的宏示例

打開excel 軟件,在視圖裏打到宏功能,建立一個名爲Test_Marco 的宏,其代碼以下:html

  1. Sub Test_Macro()
  2. MsgBox "This is a macro in Excel"
  3. End Sub

2、宏調用

一、vbs 調用宏

windows下自己能夠經過vbs 腳本很容易的實現宏的調用,代碼以下:python

  1. Set oExcel = createobject("Excel.Application")
  2. oExcel.Visible = false
  3. Set oWorkbooks = oExcel.Workbooks.Open("d:/test.xlsm")
  4. oExcel.Run "Test_Macro"
  5. oWorkbooks.Close
  6. oExcel.Quit
  7. Set oWorkbooks= nothing
  8. Set oExcel= nothing

保存後,右鍵選擇VBS程序打開執行和直接打開excel 後調用的結果是相同的。linux

二、python調用宏

python 調用宏是利用了win32com模塊實現的,具體代碼以下:windows

  1. from __future__ import print_function
  2. import unittest
  3. import os.path
  4. import win32com.client
  5. class ExcelMacro(unittest.TestCase):
  6. def test_excel_macro(self):
  7. try:
  8. xlApp = win32com.client.DispatchEx('Excel.Application')
  9. xlsPath = os.path.expanduser('d:\\test.xlsm')
  10. wb = xlApp.Workbooks.Open(Filename=xlsPath)
  11. xlApp.Run('Test_Macro')
  12. wb.Save()
  13. xlApp.Quit()
  14. print("Macro ran successfully!")
  15. except:
  16. print("Error found while running the excel macro!")
  17. xlApp.Quit()
  18. if __name__ == "__main__":
  19. unittest.main()

固然上面的unittest和future模塊是非必須的。另外,宏調用還有傳參的狀況存在,若是出現須要傳參的狀況時,能夠經過以下代碼實現傳參:工具

  1. import win32com.client
  2. xl=win32com.client.Dispatch("Excel.Application")
  3. xl.Visible = True
  4. Path = "C:\\Program Files\\Microsoft Office\\Office14\\XLSTART\\perso.xlsm"
  5. xl.Workbooks.Open(Filename=Path)
  6. param1 = "Jeremy"
  7. param2 = 3
  8. xl.Application.Run("Proc", param1, param2)

3、excel 中宏的導入導出

一、unzip解包獲取宏文件

自excel 2007之後的帶宏excel 文件是經過zip工具進行解包的,我這裏以linux unzip工具爲例,命令以下:測試

unzip myfile.xlsm -d myfile

如上面的測試用的test.xlsm 經過unzip 解包到myfile目錄時,會在myflie/xl/ 目錄下發現vbaProject.bin 文件。ui

注:不過該方法獲取的宏文件中,會仍帶有原excel 文件的文件名,在執行調用宏操做時,可能會現告警。spa

二、python 腳本實現導出宏文件

在安裝完xlsxwriter模塊後,其自帶一個vba_extract.py 腳本,若是你找不到該腳本也不要緊,由於其代碼至關短,你能夠在其餘目錄新建一個py文件,內容以下:excel

  1. #!C:\Python27\python.exe
  2. # EASY-INSTALL-SCRIPT: 'xlsxwriter==0.7.3','vba_extract.py'
  3. __requires__ = 'xlsxwriter==0.7.3'
  4. __import__('pkg_resources').run_script('xlsxwriter==0.7.3', 'vba_extract.py')

我這裏使用的是0.7.3版本的xlswriter,後續有更新時,後面的版本號可能會不同,具體以安裝後的版本號爲準 。以導出上面的test.xlsm 裏的測試宏爲例:htm

  1. $ vba_extract.py test.xlsm
  2. Extracted: vbaProject.bin

一樣,剝離出了二進制的宏文件。這裏導出的方法比較乾淨,不會保留原excel 文件句,因此在其餘excel 中導入使用也不會告警,因此推薦使用該方法導出宏。

三、導入excel 宏文件

xlsxwriter 模塊帶有add_vba_project方法用於導入宏文件,同進也提供了set_vba_name方法用於重命名宏文件。這裏使用的仍是上面的導出的vbaProject.bin文件,新建一個測試的excel文件以下:

  1. import xlsxwriter
  2. # Note the file extension should be .xlsm.
  3. workbook = xlsxwriter.Workbook('macros.xlsm')
  4. worksheet = workbook.add_worksheet()
  5. worksheet.set_column('A:A', 30)
  6. # Add the VBA project binary.
  7. workbook.add_vba_project('./vbaProject.bin')
  8. # Show text for the end user.
  9. worksheet.write('A3', 'Press the button to say hello.')
  10. # Add a button tied to a macro in the VBA project.
  11. worksheet.insert_button('B3', {'macro': 'say_hello',
  12. 'caption': 'Press Me',
  13. 'width': 80,
  14. 'height': 30})
  15. workbook.close()

上面的示例中,建立了一個excel 文件,並在A3單元格輸入了相關的內容,並在excel B3單元格定義了一個調用宏的按鍵 。點擊該按鍵能夠直接調用導入的宏文件。

不過遺憾的是,在xlsxwriter 模塊中未找到直接調用宏的方法,若是相在導入後,直接調用,能夠考慮和上面提到的win32com模塊一塊兒使用。

 

參考頁面:

xlsxwriter macros使用頁

相關文章
相關標籤/搜索