/* Copyright (c) 2014 Dr David H. Akehurst (itemis), All Rights Reserved * * The contents of this file is dual-licensed under 2 * alternative Open Source/Free licenses: LGPL 2.1 or later and * Apache License 2.0. (starting with JNA version 4.0.0). * * You can freely decide which license you want to apply to * the project. * * You may obtain a copy of the LGPL License at: * * http://www.gnu.org/licenses/licenses.html * * A copy is also included in the downloadable source code package * containing JNA, in file "LGPL2.1". * * You may obtain a copy of the Apache License at: * * http://www.apache.org/licenses/ * * A copy is also included in the downloadable source code package * containing JNA, in file "AL2.0". */ package com.sun.jna.platform.win32.COM.util.office; import com.sun.jna.Pointer; import com.sun.jna.platform.win32.COM.Helper; import java.io.File; import com.sun.jna.platform.win32.COM.util.AbstractComEventCallbackListener; import com.sun.jna.platform.win32.COM.util.Factory; import com.sun.jna.platform.win32.COM.util.IComEventCallbackCookie; import com.sun.jna.platform.win32.COM.util.office.excel.ComExcel_Application; import com.sun.jna.platform.win32.COM.util.office.excel.ComIAppEvents; import com.sun.jna.platform.win32.COM.util.office.excel.ComIApplication; import com.sun.jna.platform.win32.COM.util.office.excel.ComIRange; import com.sun.jna.platform.win32.COM.util.office.excel.ComIWorkbook; import com.sun.jna.platform.win32.COM.util.office.excel.ComIWorksheet; import com.sun.jna.platform.win32.Ole32; import java.io.IOException; public class MSOfficeExcelDemo { private static final String currentWorkingDir = new File("").getAbsolutePath() + File.separator; public static void main(String[] argv) throws IOException { Ole32.INSTANCE.CoInitializeEx(Pointer.NULL, Ole32.COINIT_MULTITHREADED); try { testExcel(); } finally { Ole32.INSTANCE.CoUninitialize(); } } public static void testExcel() throws IOException { File demoDocument = null; ComIApplication msExcel = null; Factory factory = new Factory(); try { System.out.println("Files in temp dir: " + Helper.tempDir.getAbsolutePath()); ComExcel_Application excelObject = factory.createObject(ComExcel_Application.class); msExcel = excelObject.queryInterface(ComIApplication.class); System.out.println("MSExcel version: " + msExcel.getVersion()); msExcel.setVisible(true); Helper.sleep(5); demoDocument = Helper.createNotExistingFile("jnatest", ".xls"); Helper.extractClasspathFileToReal("/com/sun/jna/platform/win32/COM/util/office/resources/jnatest.xls", demoDocument); ComIWorkbook workbook = msExcel.getWorkbooks().Open(demoDocument.getAbsolutePath()); msExcel.getActiveSheet().getRange("A1").setValue("Hello from JNA!"); // wait 1sec. before closing Helper.sleep(1); // Save document into temp and close File output = new File(Helper.tempDir, "jnatest.xls"); output.delete(); workbook.SaveAs(output.getAbsolutePath()); msExcel.getActiveWorkbook().Close(false); // // msExcel.newExcelBook(); msExcel.getWorkbooks().Open(output.getAbsolutePath()); msExcel.getActiveSheet().getRange("A2").setValue("Hello again from JNA!"); class Listener extends AbstractComEventCallbackListener implements ComIAppEvents { volatile boolean SheetSelectionChange_called; @Override public void errorReceivingCallbackEvent(String message, Exception exception) { } @Override public void SheetSelectionChange(ComIWorksheet sheet, ComIRange target) { SheetSelectionChange_called = true; } }; Listener listener = new Listener(); IComEventCallbackCookie cookie = msExcel.advise(ComIAppEvents.class, listener); Helper.sleep(1); msExcel.getActiveSheet().getRange("A5").Activate(); Helper.sleep(1); msExcel.unadvise(ComIAppEvents.class, cookie); System.out.println("Listener was fired: " + listener.SheetSelectionChange_called); // close and discard changes msExcel.getActiveWorkbook().Close(false); } finally { // Make sure the excel instance is shut down if (null != msExcel) { msExcel.Quit(); } // Release all objects acquired by the factory factory.disposeAll(); if (demoDocument != null && demoDocument.exists()) { demoDocument.delete(); } } } }