600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > 使用VBA调用jar传递参数 并获取返回值

使用VBA调用jar传递参数 并获取返回值

时间:2019-05-31 07:22:51

相关推荐

使用VBA调用jar传递参数 并获取返回值

目录

■VBA代码

■Java代码

■运行效果

Excel

Log效果 (通过VBA调用jar后,运行,生成的Log)

■课题

■课题原因(直接原因)

●log4j的配置

■课题验证

■课题解决(其他 方式二 实现)

■另外一种方式启动执行jar(方式一: RetVal = Shell(cmdStr))---无法获得返回值

■另外一种方式启动执行jar(方式二:WshShell对象 ,Run方法)---可以获得返回值

■代码简介

WshShell对象 ,Run方法, 详细介绍

■相关知识

1.Maven打包生成jar

2.log4J配置使用

3.Maven工程做成

4.使用Git,管理代码版本

■更多知识

1.Java知识整理

2.软件开发中使用单词

3.VBA操作相关内容整理

■VBA代码

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)Private Sub CommandButton1_Click()Dim cmdStrcmdStr = "java -jar G:\MyTool\VBA_Jar\jar\tool.jar " & """" & ActiveSheet.Range("C4").Value & """"Set WshShell = CreateObject("WScript.Shell")Set oExec = WshShell.Exec(cmdStr)Dim exitCodeexitCode = oExec.exitCodeDo While exitCode = 0Sleep 3000exitCode = oExec.exitCodeLoopSet oStdOut = oExec.StdOutMsgBox "Return value is : " & exitCodeEnd Sub

■Java代码

package com.sxz.tool.moveResource;import lombok.extern.slf4j.Slf4j;@Slf4jpublic class StartProcessRun {public static void main(String[] args) {// TODO Auto-generated method stubString input = "";if(args.length == 1){input= args[0];}log.info("hello:" + input);System.exit(666);}}

■运行效果

Excel

===

Log效果 (通过VBA调用jar后,运行,生成的Log)

■课题

当java的处理内容多时,

会一直停留在命令行窗口界面,无法获得正常的返回值。

强制终了后,返回值是【130】

■课题原因(直接原因)

根本原因未知

直接原因是因为使用了log4j,(换成logback也有同样的问题。)

●log4j的配置

===

/sxzlc/article/details/124621551

===

■课题验证

在程序开始的时候,循环出力200次log,实际结果只能出力40次。

■课题解决(其他 方式二 实现)

但是为什么这种方式不行,另外一种方式启动执行jar(方式一)(无法获得返回值),可以正常结束。

另外一种方式启动执行jar(方式一: RetVal = Shell(cmdStr))---无法获得返回值

按钮对应的函数

Private Sub CommandButton1_Click()Call callJarEnd Sub

定义在模块中的方法

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)Public Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandel As Long, ByVal dwMilliseconds As Long) As LongPublic Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As LongPublic Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal blnheritHandel As Long, ByVal dwProcessld As Long) As LongPublic Sub callJar()Dim cmdStrcmdStr = "java -jar G:\MyTool\VBA_Jar\jar\tool.jar " & """" & ActiveSheet.Range("C4").Value & """"RetVal = Shell(cmdStr)processId = OpenProcess(&H100000, False, RetVal)r = WaitForSingleObject(processId, -1&)r = CloseHandle(processId)End Sub

另外一种方式启动执行jar(方式二:WshShell对象 ,Run方法)---可以获得返回值

这种方式调用,可以获得返回值

不论是是

cmdStr = "java -jar G:\MyTool\VBA_Jar\jar\tool.jar " & """" & ActiveSheet.Range("C4").Value & """"

还是

cmdStr = "cmd /c java -jar G:\MyTool\VBA_Jar\jar\tool.jar " & """" & ActiveSheet.Range("C4").Value & """"

都可以获得返回值

===

Private Sub CommandButton1_Click()Dim cmdStrcmdStr = "java -jar G:\MyTool\VBA_Jar\jar\tool.jar " & """" & ActiveSheet.Range("C4").Value & """"Set WshShell = CreateObject("WScript.Shell")Dim endCode As IntegerendCode = WshShell.Run(cmdStr, True, True)MsgBox endCodeEnd Sub

■代码简介

===

Run的后两个参数,一个是cmd窗口的风格,一个是是否等待执行完成。最后一个参数很有用,如果你希望等待本次cmd执行的程序结束后,再执行run后面的语句,设置这个参数为true,否则后面的语句将不等待cmd窗口完成,直接运行。另外,如果你使用exec 方法的时候,如果希望等待cmd中程序执行完后,再执行后面的语句需要类似下面的代码===Do While exitCode = 0Sleep 3000exitCode = oExec.exitCodeLoop===

===

===

WshShell对象 ,Run方法, 详细介绍

' 虽然第二个参数是数字,但是写True也好用,空白时,令行窗口一闪而过,True时,不显示 endCode = WshShell.Run(cmdStr, True, True)

===

VBSkeywords: Run方法, WshShell对象object.Run(strCommand, [intWindowStyle], [bWaitOnReturn])【参数】object WshShell 对象。 strCommand 表示要运行的命令行的字符串值。包括要传递到可执行文件的所有参数。 intWindowStyle 可选。表示程序窗口外观的整数值。请注意,并非所有程序都使用此信息。 bWaitOnReturn 可选。布尔值,表示在继续执行脚本中的下一条语句之前,脚本是否等待执行完程序。如果设为 true,则在执行完程序后才执行脚本,Run 方法返回由程序返回的任何错误代码。如果设为 false(默认值),则 Run 方法将自动在启动程序后立即返回 0(不是错误代码)。【说明】Run 方法返回一个整数。Run 方法启动在新 Windows 进程中运行的程序。可以让脚本等到程序执行完后再继续执行。这允许您同步运行脚本和程序。strCommand 参数内的环境变量自动扩展。如果某个文件类型已正确注册到某个程序中,则对该类型的文件调用 Run 方法时将执行该程序。 例如,如果您的计算机系统中装有 Word,则对 *.doc 文件调用 Run 方法时将启动 Word 并加载该文档。【intWindowStyle 说明 】0 隐藏一个窗口并激活另一个窗口。 1 激活并显示窗口。如果窗口处于最小化或最大化状态,则系统将其还原到原始大小和位置。第一次显示该窗口时,应用程序应指定此标志。 2 激活窗口并将其显示为最小化窗口。 3 激活窗口并将其显示为最大化窗口。 4 按最近的窗口大小和位置显示窗口。活动窗口保持活动状态。 5 激活窗口并按当前的大小和位置显示它。 6 最小化指定的窗口,并按照 Z 顺序激活下一个顶部窗口。 7 将窗口显示为最小化窗口。活动窗口保持活动状态。 8 将窗口显示为当前状态。活动窗口保持活动状态。 9 激活并显示窗口。如果窗口处于最小化或最大化状态,则系统将其还原到原始大小和位置。还原最小化窗口时,应用程序应指定此标志。 10 根据启动应用程序的程序状态来设置显示状态。

===

■相关知识

1.Maven打包生成jar

POM 打包 Jar,指定Main方法的类,指定使用的JDK_sun0322的博客-CSDN博客_pom打包指定main

2.log4J配置使用

/sxzlc/article/details/124621551

3.Maven工程做成

Maven的Pom文件 ( Eclipse中创建Maven工程, 使用注意点,DevOps相关)_sun0322的博客-CSDN博客_eclipse的pom文件在哪

4.使用Git,管理代码版本

Eclipse中的Git使用之Branch创建,Merge_sun0322的博客-CSDN博客

■更多知识

1.Java知识整理

Java8新特性学习_001_(Lambda表达式,函数式接口,方法引用,Stream类,Optional类)_sun0322的博客-CSDN博客

2.软件开发中使用单词

工作中使用到的单词(软件开发)_sun0322的博客-CSDN博客_https://10.59.142.4/integration

3.VBA操作相关内容整理

VBA中 各种数据类型的使用(自定义数据类型Type,数组,数据字典)、读写文件_sun0322的博客-CSDN博客_vba中type类型

===

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。