2013-07-01 165 views
2

我正在運行TIBCO Spotfire v4。它內置了IronPython。希望運行Spotfire報告,該報告將導出一個.xls文件(該部分完成)。尋找一個腳本來打開一個Excel文件並運行一個宏來格式化文件。IronPython - 運行Excel宏

以下是我找到並嘗試使用的一些代碼。不確定進口產品來自哪裏!

import os, os.path, win32com.client 

def run_macro(fName, macName, path=os.getcwd()): 
    """ 
    pre: fName is the name a valid Excel file with macro macName 
    post: fName!macName is run, fName saved and closed 
    """ 
    fName = os.path.join(path, fName) 
    xlApp = win32com.client.Dispatch("Excel.Application") 
    fTest = xlApp.Workbooks.Open(fName) 
    macName = fTest.Name + '!' + macName xlApp.Run(macName) 
    fTest.Close(1) 
    xlApp.Quit() 
    xlApp = None 

編輯器 - 代碼看起來是從Cannot iterate VBA macros from Python

+0

你能告訴我們你試過嗎? –

+0

以下是我找到並嘗試使用的一些代碼。不確定進口產品來自哪裏!導入os,os.path,win32com.client def run_macro(fName,macName,path = os.getcwd()):「」「pre:fName是一個有效的Excel文件,名稱爲macName macName post:fName!macName is run, fName保存並關閉「」「fName = os.path.join(path,fName)xlApp = win32com.client.Dispatch(」Excel.Application「)fTest = xlApp.Workbooks.Open(fName)macName = fTest.Name +' ! + macName xlApp.Run(macName)fTest.Close(1)xlApp.Quit()xlApp =無 – user2540187

+0

它看起來像現有的答案涵蓋了你的問題,你試過它,併爲你工作嗎?如果是這樣,請考慮將其標記爲已接受的答案,或讓我們知道還不完全正確。 – RyanfaeScotland

回答

2

我有一個類似的問題(試圖從ipy運行Excel VBA宏),並最終得到它的工作。

# .net access 
import clr 
clr.AddReference("Microsoft.Office.Interop.Excel") 

# opening the workbook 
excel = Excel.ApplicationClass() 
excel.Visible = True 
excel.DisplayAlerts = False 
workbook = excel.Workbooks.Open(r"C:\your\file\here.xls") 
# or open locally: 
# workbook = ex.Workbooks.Open('here.xls') 

# running the macro 
excel.Run('YOUR-MACRO-NAME') 

# closing down 
excel.Exit() 

第一部分是使用.NET,並且第二部分被實際執行該宏:

嘗試此代碼。請注意,這是從未打開的excel文件運行excel代碼。如果你想從一個已經打開的文件中運行一個宏(我也必須這麼做,所以我想把它放在這裏),你需要將它識別爲活動對象而不是打開它(參見下面)。運行宏的代碼仍然與上面相同。

# recognizing an already opened window 
from System.Runtime.InteropServices import Marshal 
excel = Marshal.GetActiveObject("Excel.Application") 

這個環節是非常有用的,當我正在尋找一個解決方案:

http://www.ironpython.info/index.php?title=Interacting_with_Excel

+1

我不得不註釋掉DisplayAlerts,因爲它引發了一個異常(顯然是已知的bug),並且使用了excel.Quit()而不是excel.Exit(),但除此之外,這看起來是一個正確答案+1。 – RyanfaeScotland