想用java操作word文件?jacob是个不错的选择也就是javacom桥你可以在project/下载我下载的版本是注意版本太低的话可能会报错
如果没有特殊需求可以直接使用jacob_*zip中提供的jacobjar和jacobdll把jacobdll文件放在系统可以找得到的路径上一般放c:/windows/system下就行了注意你用的jacobdll文件和你的jacobjar包要匹配否则会报错哦!
如果想自己编译也很简单把jacob_*_srczip解开建个工程在buildxml中稍作配置即可
<property name=JDK value=D:\Java\jsdk_/>
<property name=MSDEVDIR value=D:\Microsoft Visual Studio\VC/>
<property name=version value=/>
看出来了吗你的机器上需要有JDK和VC环境VC是用来生成jacobdll文件的如果编译时说找不到MSPDBDLL那就在你的Microsoft Visual Studio目录下搜索一下拷贝到D:\Microsoft Visual Studio\VC\Bin下就行了
如果需要对jacob里的jar包改名(虽然通常不会发生这种情况但如果你需要两个版本的jacob同时使用改名可能是一种选择)这时你的工作就多一些
()package改名是必须的了比如我们把src下的comjacobactiveX改为comtestjacobactiveX把改为打包时只有这两个包是有用的所以只改它们就够了
()然后修改buildxml中srcjavajacobmainpackage的value为comtestjacob修改javaclassmain的value为Jacob
()别忘了javaJarBin中打包的源码路径也要改<include name=com/**/*class />改为<include name=com/test/**/*class />
()buildxml中对生成的dll和jar包也要改个名比如我们把这两个文件改为jacob_testdll和jacob_testjar修改buildxml中的eneratedfilenamedll和generatedfilenamejar的value为你新改的名字
()LibraryLoader中SystemloadLibrary(jacob);改成SystemloadLibrary(jacob_test); ()另外很重要的在jni中*cpp和*h中com_jacob_com统一改为com_test_jacob_comcom/jacob/com统一改为com/test/jacob/com
()ant编译编译好的文件在release目录下
()最后把编译好的jacob_testdll文件放在windows/system下就大功告成了
现在该用到jacobjar了如果你自己修改过jar包的名字用新改的jar包如jacob_testjar这里统一称为jacobjar
首先在classpath中引入jacobjar包如果是web应用WEBINF的lib中也要加入jacobjar包
下面给一个例子
类ReplaceWordjava
import *;
import comjacobactiveX*;
public class ReplaceWord {
public static void main(String[] args) {
ActiveXComponent app = new ActiveXComponent(WordApplication); //启动word
String inFile = C:\\testdoc; //要替换的word文件
try {
appsetProperty(Visible new Variant(false)); //设置word不可见
Dispatch docs = appgetProperty(Documents)toDispatch();
Dispatch doc = Dispatchinvoke(docsOpenDispatchMethodnew Object[] { inFile new Variant(false)new Variant(false) } new int[])toDispatch(); //打开word文件注意这里第三个参数要设为false这个参数表示是否以只读方式打开因为我们要保存原文件所以以可写方式打开
Dispatch selection=appgetProperty(Selection)toDispatch();//获得对Selection组件Dispatchcall(selection HomeKey new Variant());//移到开头
Dispatch find = Dispatchcall(selection Find)toDispatch();//获得Find组件
Dispatchput(find Text name); //查找字符串name
Dispatchcall(find Execute); //执行查询
Dispatchput(selection Text 张三); //替换为张三
Dispatchcall(doc Save); //保存
Dispatchcall(doc Close new Variant(false));
} catch (Exception e) {
eprintStackTrace();
} finally {
appinvoke(Quit new Variant[] {});
appsafeRelease();
}
}
}
也许你会问我怎么知道要调用哪个方法传哪些参数来进行操作?别忘了word还有宏呢!自己录制一个宏编辑这个宏就可以看到代码了!用哪个对象的哪个方法就看你的了
我总结了一下
document下的组件都用Dispatch selection=appgetProperty(Selection)toDispatch()这种方法获得
再往下的组件就需要调用selection的方法来获取如 Dispatch find = Dispatchcall(selection Find)toDispatch()
如果某个方法需要参数Dispatch doc = Dispatchinvoke(docsOpenDispatchMethodnew Object[] { inFile new Variant(false)new Variant(false) } new int[])toDispatch()是一个例子这是调用docs的Open方法Object[]数组里就是它需要的参数了
如果要修改某个组件的属性呢用Dispatchput(find Text name)这种形式Text是属性名name是值