Samples‎ > ‎NativePeer‎ > ‎

Connect to running Excel application

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;
    }
}