2013-07-01 131 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