蛋疼的,前几天要word转pdf 然后再pdfMerge,今天又要wordMerge 。。。
代码来源 : http://blog.sina.com.cn/s/blog_5d603b170100wcrh.html
acob(Java COM Bridge)是一个开始于1999年的开源项目,它支持在Java环境中调用Windows平台下的COM组件,接下来我们要使用的dll文件就是COM组件。
运行以下代码需下载jar包及dll文件 (http://sourceforge.net/projects/jacob-project/)
PS:首先电脑要安装Office软件中的Word程序,容易忽视的是我们自己的电脑安装了但服务器没装。另外要根据机器类型选择相应的jacob.dll文件(x86,x64),并将dll文件放在JDK安装目录下的\jre1.6.0_5\bin目录中,其实放在系统system32目录或tomcat的bin目录下也可以,只要在java.library.path中就成。
稍微做了下修改,测试代码如下,测试成功。
package com.hundsun.gildata.irp.core.base; import java.io.File; import com.jacob.activeX.ActiveXComponent; import com.jacob.com.ComThread; import com.jacob.com.Dispatch; import com.jacob.com.Variant; public class JacobWord { private ActiveXComponent app; private Dispatch document; private Dispatch selection; private Dispatch paragraph; private Dispatch font; // 初始化并新建Word文档 public JacobWord() { ComThread.InitSTA();// 初始化Com线程 app = new ActiveXComponent("Word.Application");// 初始化word应用程序 app.setProperty("Visible", new Variant(false));// 设置word文档不在前台打开 app.setProperty("AutomationSecurity", new Variant(3)); // 禁用宏 Dispatch docs = app.getProperty("Documents").toDispatch();// 获取文挡属性 document = Dispatch.call(docs, "Add").toDispatch(); // 创建新文档 selection = app.getProperty("Selection").toDispatch();// 获得选定内容 paragraph = Dispatch.get(selection, "ParagraphFormat").getDispatch();// 段落 font = Dispatch.get(selection, "Font").toDispatch();// 字体 } public static void main(String[] args) { File filePath = new File("d:\\wordtest"); if (filePath.exists()) { new JacobWord().mergeWord(filePath.listFiles()); } } // 合并Word文档 private void mergeWord(File[] file) { try { setWordTitle(); // 设置文本样式,不包括接下来要插入的WORD文档内容 Dispatch.put(paragraph, "Alignment", "3");// 1:中 2:右 3:左 Dispatch.put(font, "Color", "1,0,0,0"); // 红色 Dispatch.put(font, "Size", 12); for (int i = 0; i < file.length; i++) { String tempFile = file[i].getAbsolutePath(); if (tempFile.endsWith(".doc") || tempFile.endsWith(".docx")) { Dispatch.put(selection, "Text", file[i].getName() + "文档内容如下:"); Dispatch.call(selection, "MoveDown"); Dispatch.call(selection, "TypeParagraph"); // 空一行段落 Dispatch.call(selection, "insertFile", tempFile);// 插入文件内容 Dispatch.call(selection, "TypeParagraph"); // 空一行段落 } } fillBookmarks(new String[] { "author" }, new String[] { "victor" }); Dispatch.call(document, "SaveAs", new Variant("D:\\wordtest\\test.doc")); //保存 Dispatch.call(document, "Close", new Variant(false));// 关闭文档 } catch (Exception ex) { ex.printStackTrace(); } finally { app.invoke("Quit", new Variant(0));// 退出word应用 ComThread.Release();// 释放Com线程 } } // 设置合并后文档的标题及样式 private void setWordTitle() { Dispatch.put(paragraph, "Alignment", 1);// 1:中 2:右 3:左 Dispatch.put(font, "Bold", new Variant(true)); Dispatch.put(font, "Color", "0,0,0,0"); // 黑色 Dispatch.put(font, "Size", 16); Dispatch.call(selection, "TypeText", "合并后的Word文档"); // 写入标题内容 Dispatch.call(selection, "TypeParagraph"); // 空一行段落 } // 填充书签 private void fillBookmarks(String[] bookmarks, String[] fillValues) { Dispatch bookMarks = Dispatch.call(document, "Bookmarks").toDispatch(); if (bookmarks.length == fillValues.length) { for (int i = 0; i < bookmarks.length; i++) { Variant isExist = Dispatch.call(bookMarks, "Exists", bookmarks[i]); if (isExist.getBoolean()) { Dispatch item = Dispatch.call(bookMarks, "Item", bookmarks[i]).toDispatch(); Dispatch range = Dispatch.call(item, "Range").toDispatch(); Dispatch.put(range, "Text", fillValues[i]); } } } } }
先记录下,接着工作ing ...