随笔 - 303  文章 - 883  trackbacks - 0
<2007年3月>
25262728123
45678910
11121314151617
18192021222324
25262728293031
1234567

欢迎光临! 
闲聊 QQ:1074961813

随笔分类(357)

我管理的群

公共blog

  • n维空间
  • Email : java3d@126.com 群 : 12999758

参与管理的论坛

好友的blog

我的其他blog

朋友的网站

搜索

  •  

最新评论

这个文章给的文档和API下载地址有问题,下载问题,请大家参照下个文章
这些文章好象都有问题,等我整整写个文章给大家吧


Java 控制Office 控件是非常麻烦的一件事情。
自从有了JACOB后,事情变得简单多了。
但是要实现Java灵活的控制Word还是一件非常麻烦的事情。

下面介绍几个WORD常见的对象以及一些典型的处理过程,希望对大家有帮助。
(请注意:JDK1.3.2运行 Jacob比较正常,JDK1.4有问题)

/**  WORD对象 */  
private  ActiveXComponent word  =   null
/**  文档对象 */  
private  Dispatch documents  =   null
/**  selection 对象是比较重要的一个对象  */  
private  Dispatch vSelection  =   null
/**  一个WORD文档  */  
private  Dispatch wordfile  =   null

1,初始化

word  =   new  ActiveXComponent( " Word.Application " ); 
documents 
=  word.getProperty( " Documents " ).toDispatch(); 
(将JACOB 放在 WINNT\system32\ 下比较简单省事) 

2,打开文件

wordfile  =  Dispatch.invoke( 
documents, 
" Open "
Dispatch.Method, 
new  Object[] 
strFileName, 
new  Variant( true ), // 是否进行转换 ConfirmConversions 
new  Variant( false ) // 是否只读 
}
new   int [ 1 ]).toDispatch(); 
vSelection 
=  word.getProperty( " Selection " ).toDispatch(); 

在WORD中,选定内容进行转换时,不用象Java对象一样来回的重新取,这个对象一直有效。
3,显示WORD

word.setProperty( " Visible " new  Variant(visible)); 

4,设置WORD的位置

Dispatch activeWindow  =  Dispatch.get(word,  " Application " ).toDispatch(); 
Dispatch.put(activeWindow, 
" WindowState " new  Variant( 0 )); 
Dispatch.put(activeWindow, 
" Top " new  Variant( 0 )); 
Dispatch.put(activeWindow, 
" Left " new  Variant( 0 )); 
Dispatch.put(activeWindow, 
" Height " new  Variant( 600 )); 
Dispatch.put(activeWindow, 
" width " new  Variant( 800 )); 

进行将JAVA内的数据和WORD交换,常用的做法是,在WORD上作一些特殊的标记,利用 FIND 和 Replace的方法进行,这个方法不是太好。
个人觉得使用超链接的模式比较方便。
有几大优点:
1, Hyperlink 有3个区域可以让开发者自己利用

ActiveDocument.Hyperlinks.Add 
Anchor:
= Selection.Range, 
Address:
= " 位置 " // 地址(可以利用) 有个缺点 
SubAddress: = "" , // 子位置(可以利用) 
ScreenTip: = "" // 屏幕提示 
TextToDisplay: = " 显示内容 " // 最好利用的东西 

个人建议使用TextToDisplay。
Address 会在保存时被替换成绝对路径。
比如你录入一个
“AA.BB.CC”
保存时可能会被替换成
C:\Documents and Settings\Administrator \My Documents\AA.BB.CC
2, 可以进行自动定位
利用Hyperlinks 可以将文章中所有的超链接得到。
也可以将指定范围的超链接得到。
3, 可以自由排版
4, 可以拷贝粘贴

添加超链接:

Dispatch Hyperlinks  =  Dispatch.get(wordfile,  " Hyperlinks " ).toDispatch(); 
Dispatch range 
=  Dispatch.get(vSelection,  " Range " ).toDispatch(); 
Dispatch h
= Dispatch.invoke(Hyperlinks, 
" Add " , Dispatch.Method,  new  Object[] 
{ range, 
new  Variant( " Address " ), 
new  Variant( " SubAddress " ), 
new  Variant( " {table.fieldName} " ), // 建议的数据链接处 
new  Variant( " 姓名 " ) }
//  在WORD中显示的内容 
new   int [ 4 ]).toDispatch(); 
Dispatch hRange
= Dispatch.get(h,  " Range " ).toDispatch(); 
Dispatch.call(hRange,
" select " ); 
// 设置字体,颜色 
Dispatch font  =  Dispatch.get(vSelection,  " Font " ).toDispatch(); 
Dispatch.put(font,
" Underline " new  Variant( 0 )); 
Dispatch.put(font,
" Color " new  Variant( 0 )); 
// 取消选择 
Dispatch.call(vSelection, " MoveRight " , new  Variant( 1 ), new  Variant( 1 )); 

超链接替换内容: 
1 , 得到所有的超链接 
// 选择对象 
Dispatch.call(dObject,  " select " ); 
// 得到超链接集合 
Dispatch Hyperlinks  =  Dispatch.get(vSelection,  " Hyperlinks " ).toDispatch(); 
// 得到有多少个超链接 
int  nHyperlink  =  Dispatch.get(Hyperlinks,  " count " ).toInt(); 
// 得到一个超链接 
Dispatch hyperlink = Dispatch.invoke(Hyperlinks,  " item "
Dispatch.Method, 
new  Object[]  new  Integer(i  +   1 )}
new   int [ 1 ]).toDispatch())); 

2, 替换内容
Dispatch.put(hyperlink, "TextToDisplay", information);
3, 取消超链接,将超链接变成普通文字。
Dispatch.call(hyperlink, "delete");

如何实现批量数据自动扩展,建议使用表格进行自动扩展,方便简单。
结合使用上面超链接的技术。会非常简单:

比如有如下数据:

DataA
DataB

1, 列出所有表格
和列出所有超链接基本一样:

private   void  getTables01(Dispatch objcet,Vector vTableStore) 
Dispatch tables 
=  Dispatch.get(objcet,  " tables " ).toDispatch(); 
int  nTableAmount  =  Dispatch.get(tables,  " count " ).toInt(); 
for  ( int  i  =   0 ; i  <  nTableAmount; i ++
Dispatch table 
=  
Dispatch 
.invoke( 
tables, 
" item "
Dispatch.Method, 
new  Object[]  new  Integer(i  +   1 )}
new   int [ 1 ]) 
.toDispatch(); 
vTableStore.add(
new  DTable(table)); 
getTables01(table,vTableStore);
// 处理表格套用表格的情况 
}
 
}
 

2, 表格的可以控制的对象

Dispatch dRows  =  Dispatch.get(dTable,  " rows " ).toDispatch(); // 所有行 
int  nRows  =  Dispatch.get(dRows,  " count " ).toInt(); 
3 , 取得一行的内容 
Dispatch dRow 
=  
Dispatch 
.invoke( 
rows, 
" item "
Dispatch.Method, 
new  Object[]  new  Integer(row  +   1 )}
new   int [ 1 ]) 
.toDispatch(); 
return  dRow; 
}
catch (ComFailException cfe) 

/**  带有合并行的情况 */  
return   null
}
 

4, 得到一行的超链接
DHyperlink dhInRow[] = listHyperlinks(dRow);
5, 将某一行拷贝很多次

Dispatch.call(dRow,  " select " ); 
Dispatch.call(vSelection, 
" Copy " ); 
int  nCopyNow  =  nDataBlockRow  -   1
for  ( int  nCopys  =   0 ; nCopys  <  nCopyNow; nCopys ++
try  
Dispatch.call(vSelection, 
" Paste " ); 
}
catch (Exception e)  { e.printStackTrace(); 
// 有时候文档损坏,可以忽略本问题,实际上已经粘贴上了 
}
 
}
 

6, 替换内容,读到这里就不用介绍了。

打印预览:
Dispatch.call(wordfile,"PrintPreView");

其他的功能发掘
利用WORD的宏录制,以及VB编辑器,辅助功能,都能发掘出来



地震让大伙知道:居安思危,才是生存之道。
posted on 2007-03-24 13:31 小寻 阅读(460) 评论(0)  编辑  收藏 所属分类: j2se/j2ee/j2mec/c++/C#/pasic/vb/php/asp(.net)/win-cgi/xml...

只有注册用户登录后才能发表评论。


网站导航: