运行 使用 Ironpython 的 Spotfire 中的 VBA 宏
Run a VBA macro in Spotfire using Ironpython
所以我会尝试在此线程中提问 IronPython - Run an Excel Macro 但我没有足够的声誉。
所以大致按照 link 中给出的代码,我创建了一些代码,将文件保存到特定位置,然后打开那里存在的工作簿,调用其中的宏,这将执行对我下载到 .xls 的数据进行少量操作,使其更易于呈现。
现在我已经将问题隔离到代码的这个特定部分(如下)。
Spotfire 通常不会提供那么多信息,但它给我提供的信息很少。它似乎与 .NET 相关,但我只能说这么多。
错误信息
Traceback (most recent call last): File
"Spotfire.Dxp.Application.ScriptSupport", line unknown, in
ExecuteForDebugging File "", line unknown, in
StandardError: Exception has been thrown by the target of an
invocation.
剧本
from Spotfire.Dxp.Data.Export import DataWriterTypeIdentifiers
from System.IO import File, Directory
import clr
clr.AddReference("Microsoft.Office.Interop.Excel")
import Microsoft.Office.Interop.Excel as Excel
excel = Excel.ApplicationClass()
excel.Visible = True
excel.DisplayAlerts = False
workbook = ex.Workbooks.Open('myfilelocation')
excel.Run('OpenUp')
excel.Run('ActiveWorkbook')
excel.Run('DoStuff')
excel.Quit()
好的,所以我在这里回答我自己的问题,但我希望它能帮助别人。因此,据我所知,上面的代码非常好,但不能很好地适应我的 spotfire 环境的配置方式。然而,在采用更宏观的方法后,我找到了解决方案。
在 spotfire 端我有两个输入字段,一个给出文件路径,另一个给出文件名。然后有一个按钮 运行 下面的脚本。这些在脚本中连接在一起,但至关重要的是分开的,因为文件名需要输入到一个单独的文件中,由主宏调用,以便它可以找到文件的文件位置。
基本上我创建了三个 xml 来实现这个解决方案。第一个是包含所有主要 vba 内容的主要内容。这将查看此脚本填充的另一个 xml 中的文件夹,以查找在 spotfire 的输入字段中指定的文件的保存位置。使用自定义函数查找最新文件,它将 运行 对相关单元格值进行一系列简单的条件颜色操作。
此脚本填充两个 xml 文件并告诉主宏 运行,该宏中的代码在完成后自动关闭 excel。
第三个xml用于一系列颜色规则,因此用户可以根据自己的仪表板自定义它们。这给了它一些定制的灵活性。不是必需的,而是一些用户的潜在请求,所以我决定抢先一步。
无论如何,代码如下。
from Spotfire.Dxp.Data.Export import DataWriterTypeIdentifiers
from System.IO import File, Directory
import clr
clr.AddReference("Microsoft.Office.Interop.Excel")
import Microsoft.Office.Interop.Excel as Excel
from Spotfire.Dxp.Data.Export import *
from Spotfire.Dxp.Application.Visuals import *
from System.IO import *
from System.Diagnostics import Process
# Input field which takes the name of the file you want to save
name = Document.Properties['NameOfDocument']
# Document property that takes the path
location = Document.Properties['FileLocation']
# just to debug to make sure it parses correctly. Declaring this in the script
# parameters section will mean that the escape characters of "\" will render in a
# unusable way whereas doing it here doesn't. Took me a long time to figure that out.
print(location)
# Gives the file the correct extension.
# Couldn't risk leaving it up to the user.
newname = name + ".xls"
#Join the two strings together into a single file path
finalProduct = location + "\" + newname
#initialises the writer and filtering schema
writer = Document.Data.CreateDataWriter(DataWriterTypeIdentifiers.ExcelXlsDataWriter)
filtering = Document.ActiveFilteringSelectionReference.GetSelection(table).AsIndexSet()
# Writes to file
stream = File.OpenWrite(finalProduct)
# Here I created a seperate xls which would hold the file path. This
# file path would then be used by the invoked macro to find the correct folder.
names = []
for col in table.Columns:
names.append(col.Name)
writer.Write(stream, table, filtering, names)
stream.Close()
# Location of the macro. As this will be stored centrally
# it will not change so it's okay to hardcode it in.
runMacro = "File location\macro name.xls"
# uses System.Diagnostics to run the macro I declared. This will look in the folder I
# declared above in the second xls, auto run a function in vba to find the most
# up to date file
p = Process()
p.StartInfo.FileName = runMacro
p.Start()
长话短说:对于来自 spotfire 的 运行 excel 宏,一种解决方案是使用我在上面使用的 system.dianostics 方法,只需将宏设置为自动 运行.
所以我会尝试在此线程中提问 IronPython - Run an Excel Macro 但我没有足够的声誉。
所以大致按照 link 中给出的代码,我创建了一些代码,将文件保存到特定位置,然后打开那里存在的工作簿,调用其中的宏,这将执行对我下载到 .xls 的数据进行少量操作,使其更易于呈现。
现在我已经将问题隔离到代码的这个特定部分(如下)。
Spotfire 通常不会提供那么多信息,但它给我提供的信息很少。它似乎与 .NET 相关,但我只能说这么多。
错误信息
Traceback (most recent call last): File "Spotfire.Dxp.Application.ScriptSupport", line unknown, in ExecuteForDebugging File "", line unknown, in StandardError: Exception has been thrown by the target of an invocation.
剧本
from Spotfire.Dxp.Data.Export import DataWriterTypeIdentifiers
from System.IO import File, Directory
import clr
clr.AddReference("Microsoft.Office.Interop.Excel")
import Microsoft.Office.Interop.Excel as Excel
excel = Excel.ApplicationClass()
excel.Visible = True
excel.DisplayAlerts = False
workbook = ex.Workbooks.Open('myfilelocation')
excel.Run('OpenUp')
excel.Run('ActiveWorkbook')
excel.Run('DoStuff')
excel.Quit()
好的,所以我在这里回答我自己的问题,但我希望它能帮助别人。因此,据我所知,上面的代码非常好,但不能很好地适应我的 spotfire 环境的配置方式。然而,在采用更宏观的方法后,我找到了解决方案。
在 spotfire 端我有两个输入字段,一个给出文件路径,另一个给出文件名。然后有一个按钮 运行 下面的脚本。这些在脚本中连接在一起,但至关重要的是分开的,因为文件名需要输入到一个单独的文件中,由主宏调用,以便它可以找到文件的文件位置。
基本上我创建了三个 xml 来实现这个解决方案。第一个是包含所有主要 vba 内容的主要内容。这将查看此脚本填充的另一个 xml 中的文件夹,以查找在 spotfire 的输入字段中指定的文件的保存位置。使用自定义函数查找最新文件,它将 运行 对相关单元格值进行一系列简单的条件颜色操作。
此脚本填充两个 xml 文件并告诉主宏 运行,该宏中的代码在完成后自动关闭 excel。
第三个xml用于一系列颜色规则,因此用户可以根据自己的仪表板自定义它们。这给了它一些定制的灵活性。不是必需的,而是一些用户的潜在请求,所以我决定抢先一步。
无论如何,代码如下。
from Spotfire.Dxp.Data.Export import DataWriterTypeIdentifiers
from System.IO import File, Directory
import clr
clr.AddReference("Microsoft.Office.Interop.Excel")
import Microsoft.Office.Interop.Excel as Excel
from Spotfire.Dxp.Data.Export import *
from Spotfire.Dxp.Application.Visuals import *
from System.IO import *
from System.Diagnostics import Process
# Input field which takes the name of the file you want to save
name = Document.Properties['NameOfDocument']
# Document property that takes the path
location = Document.Properties['FileLocation']
# just to debug to make sure it parses correctly. Declaring this in the script
# parameters section will mean that the escape characters of "\" will render in a
# unusable way whereas doing it here doesn't. Took me a long time to figure that out.
print(location)
# Gives the file the correct extension.
# Couldn't risk leaving it up to the user.
newname = name + ".xls"
#Join the two strings together into a single file path
finalProduct = location + "\" + newname
#initialises the writer and filtering schema
writer = Document.Data.CreateDataWriter(DataWriterTypeIdentifiers.ExcelXlsDataWriter)
filtering = Document.ActiveFilteringSelectionReference.GetSelection(table).AsIndexSet()
# Writes to file
stream = File.OpenWrite(finalProduct)
# Here I created a seperate xls which would hold the file path. This
# file path would then be used by the invoked macro to find the correct folder.
names = []
for col in table.Columns:
names.append(col.Name)
writer.Write(stream, table, filtering, names)
stream.Close()
# Location of the macro. As this will be stored centrally
# it will not change so it's okay to hardcode it in.
runMacro = "File location\macro name.xls"
# uses System.Diagnostics to run the macro I declared. This will look in the folder I
# declared above in the second xls, auto run a function in vba to find the most
# up to date file
p = Process()
p.StartInfo.FileName = runMacro
p.Start()
长话短说:对于来自 spotfire 的 运行 excel 宏,一种解决方案是使用我在上面使用的 system.dianostics 方法,只需将宏设置为自动 运行.