Java 操作Word Excel Outlook.

转载 2016年11月07日 11:02:55


配置您的开发和运行环境

JDK:jdk1.5.0_15

我们的例子是一个基于 Eclipse 的 Java 工程。首先,使用 JACOB 来“搭桥”,您需要下载最新的 JACOB 相关类库,包括 Jacob.jar 和 Jacob.dll,将 jar 文件添加到您的 Eclipse 工程的构建路径。

图 1. 配置

解壓jacob-1.15.zip

里面有四個文件jacob.jar、jacob-1.15-x64.dll、jacob-1.15-x86.dll、JacobVersion.properties

當JDK 為32位時,應使用 acob-1.15-x86.dll。如果是64位時acob-1.15-x64.dll

jacob-1.15-x64.dll
應部署在系統環境變量path中,能夠找到目錄下。
其部署位置:
%JAVA_HOME%\bin;
%JAVA_HOME%\jre\bin;
C:\Windows\System32\
其中%JAVA_HOME%就是JDK 的安裝目錄


图 2. 修改工程的构建路径
图 2. 修改工程的构建路径

由于我们要通过 JNI 调用 DLL 文件,所以您需要把 DLL 文件添加到系统的 PATH 环境变量中,或者您也可以在程序中设置运行时的 PATH 变量。

图 3. 将 DLL 文件添加到 PATH 变量中

%SYSTEMROOT%\System32\jacob-1.15-x86.dll;%SYSTEMROOT%\System32\jacob-1.15-x86.dll



下面这段代码是測試

package org.compiere.model;

// 注意导入的包的路径
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;

import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;

public class TestMail {

	public static void main(String[] args) throws Exception {
		/*
		 * String body = "<div style='color:red;'>This is a Test !</div>";
		 * Runtime.getRuntime().exec(
		 * "D:\\Program Files\\Microsoft Office\\Office14\\OUTLOOK.EXE  mailto:KO@techson.com.hk?subject=Chinese New Year backup arrangement"
		 * + "&cc=Ko@techson.com.hk&body="+body);
		 */
		System.out.println(System.getProperty("java.library.path"));
		// System.out.println(System.getProperty("java.library.path"));

		ActiveXComponent axOutlook = new ActiveXComponent("Outlook.Application");
		// Dispatch ds = axOutlook.getObject();
		/*
		 * Dispatch namespace = Dispatch.call(axOutlook, "GetNamespace",
		 * "MAPI").toDispatch() ; String path = new
		 * File("F:/test.htm").getAbsolutePath(); Dispatch mailItem =
		 * Dispatch.call(namespace, "OpenSharedItem", path).toDispatch();
		 */

		Dispatch mailItem = Dispatch.call(axOutlook, "CreateItem", 0)
				.getDispatch();

		// Dispatch mailItem = Dispatch.call(axOutlook, "Open",
		// "F:/test.htm").toDispatch();
		// Dispatch body = Dispatch.call(mailItem, "Body").getDispatch();;
		// Dispatch.call(body, "Copy");

		Dispatch inspector = Dispatch.get(mailItem, "GetInspector")
				.getDispatch();

		// 收件人
		Dispatch recipients = Dispatch.call(mailItem, "Recipients")
				.getDispatch();
		Dispatch.call(recipients, "Add", "467915818@qq.com");
		// 邮件主题
		Dispatch.put(mailItem, "Subject", "Test5!");
		// 抄送
		//Dispatch.put(mailItem, "CC", "sunyuqi@secuunion.net");
		// Dispatch.put(mailItem, "CC", "cry@163.com");
		// Dispatch.put(mailItem, "ReadReceiptRequested", "false");

		String body = "<html><body><div style='color:red;'>This is a Test !</div></body></html>";
		// Dispatch.put(mailItem, "HTMLBody", body);

		// File file = new File("C:/test.htm");
		// FileOutputStream f = new FileOutputStream("F:/test.htm");
		// f.write(body.getBytes());
		// f.close();

		BufferedReader bf = new BufferedReader(new FileReader(new File(
				"F:/Ro.htm")));
		String html = "";
		String str = "";
		while ((str = bf.readLine()) != null) {
			html += str;
		}
		Dispatch.put(mailItem, "HTMLBody", html);

		// Dispatch bodyDis = Dispatch.get(mailItem, "Body").toDispatch();
		// Dispatch.call(bodyDis, "Add" , "F:/test.htm");
		// Dispatch.put(mailItem, "Body", new Variant("F:/test.htm"));

		// Dispatch.put(mailItem, "Body", body);
		// Dispatch.call(mailItem, "InsertAfter",body );//插入一个段落

		// Dispatch selection = Dispatch.get(axOutlook,
		// "Selection").toDispatch();

		// Dispatch inHtmleditor = Dispatch.call(inspector,
		// "HTMLEditor").getDispatch();
		// Dispatch.call(inHtmleditor, "Paste").getDispatch();
		// Dispatch.invoke(inHtmleditor, "Paste", Dispatch.Method, new
		// Object[]{false}, new Variant(false));

		// 附件
		// Dispatch attachments = Dispatch.call(mailItem,
		// "Attachments").getDispatch();
		// Dispatch.call(attachments, "Add" , "D:\\20110127.txt");
		// Dispatch.call(attachments, "Add" , "D:\\20110128.txt");
		// 显示新邮件窗口

		Dispatch.call(mailItem, "Display");
		Dispatch.call(mailItem, "Send");

	}
}


更多例子:http://uule.iteye.com/blog/1195597


实现业务逻辑

完成上面的准备工作后,就开始实现具体的业务逻辑了。

首先,要获取邮件您需要登录到指定邮箱,Outlook profile 中存储了您的邮箱的基本信息,下面的例子是如何登录特定 profile:

public void logon(String profile, String password) { 
    // 登录到指定 Profile,并获取一个会话
    ActiveXComponent session = new ActiveXComponent("Redemption.RDOSession"); 
    Dispatch.call(session, "Logon", profile, password, false, true); 
}

现在已经能够访问用户邮箱,我们要做的是获取收件箱中的标题以“ORDER NO:”开始的邮件,把信息存储到订单管理系统之中

Dispatch items = Dispatch.call(folder, "Items").toDispatch(); 
int count = Dispatch.call(items, "Count").getInt(); 
// 轮询所有邮件,并检查符合标准的邮件
for (int x = 1; x <= count; x++) { 
    Dispatch item = Dispatch.call(items, "_Item", new Integer(x)).toDispatch(); 
    ActiveXComponent sMail = new ActiveXComponent("Redemption.SafeMailItem"); 
    sMail.setProperty("Item", item); 
    Variant vSubj = Dispatch.get(sMail, "Subject"); 
    String subj = vSubj.getString(); 
    if (subj.startWith(“ORDER NO”)){ 
        // 将获取的定单信息存储到订单处理队列之中
        OrderMail mail = new OrderMail(item); 
        mail.persistToOrderQueue(); 
    } 
}

获取订单之后,将订单标记为已处理,这里我们通过操作命名属性的方式来标记状态,然后移动邮件到放置已处理邮件的目录:

// 获取命名属性的 ID 
ActiveXComponent utils = new ActiveXComponent("Redemption.MAPIUtils"); 
Variant namedPropID = Dispatch.call(utils, "GetIDsFromNames", orderMail, 
    GUID_OF_USERPROP, ORDER_STATE_DONE, true ); 
// 将邮件标记处理状态
ActiveXComponent utils = new ActiveXComponent("Redemption.MAPIUtils"); 
Dispatch.call(utils, "HrSetOneProp", orderMail, namedPropID, "Done", true ); 
// 将处理过的邮件移出现在的目录
Dispatch.call(orderMail, "Move",  folderForProcessedMsg);

您可以看到,无需关注太多类库的细节,只需要知道要使用的对象名称、方法和输入变量,就可以轻松的调用 COM 组件。JACOB 的准备工作非常简单,并且只需要非常有限的编码,就完成了现有业务系统和新应用的无缝集成。


java调用outlook

package test; import java.io.BufferedReader; public class TestMail { public static void main...
  • cbjcry
  • cbjcry
  • 2017年04月13日 10:27
  • 1117

java调用outlook

http://uule.iteye.com/blog/1195597 Java代码   package test;   import java.io.BufferedReade...
  • caolaosanahnu
  • caolaosanahnu
  • 2013年05月30日 10:47
  • 2649

Java发送outlook邮件

  • 2011年07月25日 09:16
  • 5.48MB
  • 下载

javamail写带附件eml文件并调用outlook的方法

1 将邮件写入到文件的代码       msg.saveChanges();       File f = new File("d:/test.eml");       msg.writeTo(new...
  • java2000_net
  • java2000_net
  • 2008年02月14日 07:38
  • 5719

java调用outlook word (使用JaCod开源框架)

package test; import java.io.BufferedReader; public class TestMail { public stati...
  • jk3699
  • jk3699
  • 2013年07月26日 16:32
  • 1127

借助javaMail来接收邮件之代码篇

1 JavaMail介绍      JavaMail,顾名思义,提供给开发者处理电子邮件相关的编程接口。它是Sun发布的用来处理email的API。它可以方便地执行一些常用的邮件传输。我们可以基于J...
  • weiguolee
  • weiguolee
  • 2012年04月19日 12:52
  • 6622

用java写的类似outlook程序(javamail)

  • 2008年07月10日 17:24
  • 1.63MB
  • 下载

Java开源Email客户端

  Columba Columba是基于java的客户端EMail。它有着友好的界面与很好的国际化支持。还提供一个强大的EMail管理工具支持POP3,IMAP,ESMTP。功能:多帐户,过滤器,文件...
  • elevenXL
  • elevenXL
  • 2008年01月11日 09:34
  • 2016

Java com bridge 操作Word Excel Outlook.

                  JACOB是一个 JAVA到微软的COM接口的桥梁。使用JACOB允许任何JVM访问COM对象,从而使JAVA应用程序能够调用COM对象。如果你要对 MS ...
  • kunlamp
  • kunlamp
  • 2011年04月08日 11:10
  • 1579

Java处理Word, Excel, PDF文档的4种开源系统的代码例子

很多人用java进行文档操作时经常会遇到一个问题,就是如何获得word,excel,pdf等文档的内容?我研究了一下,在这里总结一下抽取word,pdf的几种方法。  1.使用jacob抽取word,...
  • wzwfly
  • wzwfly
  • 2007年06月09日 10:16
  • 1395
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java 操作Word Excel Outlook.
举报原因:
原因补充:

(最多只允许输入30个字)