The following sample demonstrates how to find a Microsoft Excel application that is already running and connect to this instance via JExcel.
import com.jniwrapper.win32.automation.OleMessageLoop;
import com.jniwrapper.win32.com.ComException;
import com.jniwrapper.win32.com.ComFunctions;
import com.jniwrapper.win32.com.IUnknown;
import com.jniwrapper.win32.com.types.CLSID;
import com.jniwrapper.win32.excel._Application;
import com.jniwrapper.win32.excel.impl._ApplicationImpl;
import com.jniwrapper.win32.jexcel.Application;
public class ConnectToExistingApplicationSample {
public static void main(String[] args) {
Application application = getRunningExcelApplication();
if (application != null) {
System.out.println("Running Excel application found");
application.close(false);
} else {
System.out.println("There is no running Excel application");
}
}
private static Application getRunningExcelApplication() {
Application application = null;
OleMessageLoop messageLoop = new OleMessageLoop();
messageLoop.doStart();
final _Application[] applicationPeer = {null};
try {
messageLoop.doInvokeAndWait(new Runnable() {
public void run() {
IUnknown activeObject = null;
try {
activeObject = ComFunctions.getActiveObject(new CLSID("Excel.Application"));
} catch (ComException e) {
throw new RuntimeException("Unable to retrieve active Excel application", e);
}
applicationPeer[0] = new _ApplicationImpl(activeObject);
activeObject.setAutoDelete(false);
activeObject.release();
}
});
} catch (Exception e) {
Throwable cause = e.getCause();
if(cause != null){
System.out.println(cause.getMessage());
}else {
e.printStackTrace();
}
}
if (applicationPeer[0] != null) {
application = new Application(applicationPeer[0], messageLoop);
}
return application;
}
}
|
|