分享
 
 
 

利用JAVA语言深度控制Word

王朝java/jsp·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

Java控制Office控件是非常麻烦的一件事情。

自从有了JACOB后,事情变得简单多了。

但是要实现Java灵活的控制Word还是一件非常麻烦的事情。

下面介绍几个WORD常见的对象以及一些典型的处理过程,希望对大家有帮助。

(请注意:JDK1.3.2运行Jacob比较正常,JDK1.4有问题)

/**WORD对象*/

privateActiveXComponentword=null;

/**文档对象*/

privateDispatchdocuments=null;

/**selection对象是比较重要的一个对象*/

privateDispatchvSelection=null;

/**一个WORD文档*/

privateDispatchwordfile=null;

1,初始化

word=newActiveXComponent("Word.Application");

documents=word.getProperty("Documents").toDispatch();

(将JACOB放在WINNT\system32\下比较简单省事)

2,打开文件

wordfile=Dispatch.invoke(

documents,

"Open",

Dispatch.Method,

newObject[]{

strFileName,

newVariant(true),//是否进行转换ConfirmConversions

newVariant(false)//是否只读

},newint[1]).toDispatch();

vSelection=word.getProperty("Selection").toDispatch();

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

3,显示WORD

word.setProperty("Visible",newVariant(visible));

4,设置WORD的位置

DispatchactiveWindow=Dispatch.get(word,"Application").toDispatch();

Dispatch.put(activeWindow,"WindowState",newVariant(0));

Dispatch.put(activeWindow,"Top",newVariant(0));

Dispatch.put(activeWindow,"Left",newVariant(0));

Dispatch.put(activeWindow,"Height",newVariant(600));

Dispatch.put(activeWindow,"width",newVariant(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:\DocumentsandSettings\Administrator\MyDocuments\AA.BB.CC

2,可以进行自动定位

利用Hyperlinks可以将文章中所有的超链接得到。

也可以将指定范围的超链接得到。

3,可以自由排版

4,可以拷贝粘贴

添加超链接:

DispatchHyperlinks=Dispatch.get(wordfile,"Hyperlinks").toDispatch();

Dispatchrange=Dispatch.get(vSelection,"Range").toDispatch();

Dispatchh=Dispatch.invoke(Hyperlinks,

"Add",Dispatch.Method,newObject[]

{range,

newVariant("Address"),

newVariant("SubAddress"),

newVariant("{table.fieldName}"),//建议的数据链接处

newVariant("姓名")},//在WORD中显示的内容

newint[4]).toDispatch();

DispatchhRange=Dispatch.get(h,"Range").toDispatch();

Dispatch.call(hRange,"select");

//设置字体,颜色

Dispatchfont=Dispatch.get(vSelection,"Font").toDispatch();

Dispatch.put(font,"Underline",newVariant(0));

Dispatch.put(font,"Color",newVariant(0));

//取消选择

Dispatch.call(vSelection,"MoveRight",newVariant(1),newVariant(1));

超链接替换内容:

1,得到所有的超链接

//选择对象

Dispatch.call(dObject,"select");

//得到超链接集合

DispatchHyperlinks=Dispatch.get(vSelection,"Hyperlinks").toDispatch();

//得到有多少个超链接

intnHyperlink=Dispatch.get(Hyperlinks,"count").toInt();

//得到一个超链接

Dispatchhyperlink=Dispatch.invoke(Hyperlinks,"item",

Dispatch.Method,newObject[]{newInteger(i+1)},

newint[1]).toDispatch()));

2,替换内容

Dispatch.put(hyperlink,"TextToDisplay",information);

3,取消超链接,将超链接变成普通文字。

Dispatch.call(hyperlink,"delete");

如何实现批量数据自动扩展,建议使用表格进行自动扩展,方便简单。

结合使用上面超链接的技术。会非常简单:

比如有如下数据:

DataA

DataB

1,列出所有表格

和列出所有超链接基本一样:

privatevoidgetTables01(Dispatchobjcet,VectorvTableStore){

Dispatchtables=Dispatch.get(objcet,"tables").toDispatch();

intnTableAmount=Dispatch.get(tables,"count").toInt();

for(inti=0;i<nTableAmount;i++){

Dispatchtable=

Dispatch

.invoke(

tables,

"item",

Dispatch.Method,

newObject[]{newInteger(i+1)},

newint[1])

.toDispatch();

vTableStore.add(newDTable(table));

getTables01(table,vTableStore);//处理表格套用表格的情况

}

}

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

DispatchdRows=Dispatch.get(dTable,"rows").toDispatch();//所有行

intnRows=Dispatch.get(dRows,"count").toInt();

3,取得一行的内容

DispatchdRow=

Dispatch

.invoke(

rows,

"item",

Dispatch.Method,

newObject[]{newInteger(row+1)},

newint[1])

.toDispatch();

returndRow;

}catch(ComFailExceptioncfe)

{

/**带有合并行的情况*/

returnnull;

}

4,得到一行的超链接

DHyperlinkdhInRow[]=listHyperlinks(dRow);

5,将某一行拷贝很多次

Dispatch.call(dRow,"select");

Dispatch.call(vSelection,"Copy");

intnCopyNow=nDataBlockRow-1;

for(intnCopys=0;nCopys<nCopyNow;nCopys++){

try{

Dispatch.call(vSelection,"Paste");

}catch(Exceptione){e.printStackTrace();

//有时候文档损坏,可以忽略本问题,实际上已经粘贴上了

}

}

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

打印预览:

Dispatch.call(wordfile,"PrintPreView");

其他的功能发掘

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有