从Excel / VBA调用Scala函数

我知道使用C ++可以创build包含某些函数的DLL文件,然后将其导入到Excel中(例如,通过VBA)。 让我们来看看下面的C ++函数

double __stdcall square_it(double &x) { return x*x; } 

我们假设它被合并在square.dll中,以便我们可以使用下面的VBA导入

 Declare PtrSafe Function square_it Lib "square.dll" (ByRef x As Double) As Double Private Sub TestSub() MsgBox square_it(4.5) End Sub 

所以我的问题是:是否有可能在Scala中编写一个函数,然后以类似的方式从VBA调用它?

在这里,Scala不会和Java有什么不同,并且可以在VB.net程序中使用Java库吗? 和从VBA / VBScript / Visual Basic Classic调用Java库(JAR) ,没有很好的解决scheme来获得与VBA / C ++在VBA / Java或VBA / Scala中相同级别的集成。

你总是可以使用任何外部通道在你的VBA和你的Scala之间进行通信,比如在一个shell,文件系统,甚至是http,但是这不像你的VBA / C ++那样直接和高效。

以下是通过shell进行沟通的情况:

在example.scala中:

 object Example { def main(args: Array[String]): Unit = { val d = args.head.toDouble println(d * d) } } 

在example.vba中:

 Module Example Sub Main() Dim command As String command = "scala /path/to/example.scala 123" Range("A1").Value = CreateObject("WScript.Shell").Exec(command).StdOut.ReadAll End Sub End Module 

ScalaJVM上运行,而VBA则不在,因此在它们之间没有本地方式来传递对象。

ScalaVBA之间有两种交stream方式:

一种select是为每个过程调用启动一个新进程,并parsing输出,就像@OlivierBlanvillain在他的回答中所build议的那样。

我认为首选的方法是在networking套接字中进行通信,尤其是使用networking服务器的http

networking服务器

使用一个Scala Web服务器(有很多),例如scalatra ,每个过程调用都应该映射到一个http请求到localhost:

斯卡拉服务器代码(与scalatra )

 class ScalaCall extends ScalatraServlet { get("/:func/:params") { Calling function {params("func")} with parameters {params("params")} } } 

VBA客户端代码

 Public Function ScalaCall(ByVal func As String, ByVal params As String) As String Dim WinHttpReq As Object Set WinHttpReq = CreateObject("Microsoft.XMLHTTP") WinHttpReq.Open "GET", "http://127.0.0.1/" & func & "/" & params, False WinHttpReq.Send If WinHttpReq.Status = 200 Then ScalaCall = WinHttpReq.ResponseBody End If End Function 

VBA上调用ScalaCall("f","x")应该向scala服务器调用一个请求,该请求将输出Calling function f with parameters x

您可以使用Obba – Excel的一个Java对象处理程序,LibreOffice和OpenOffice。