Java深度控制word

原创 2007年10月07日 10:47:00
JAVA 深度控制 WORD

  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编辑器,辅助功能,都能发掘出来。 
 
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

深度学习word2vec笔记之基础篇

深度学习word2vec笔记之基础篇

重磅︱文本挖掘深度学习之word2vec的R语言实现

笔者寄语:2013年末,Google发布的 word2vec工具引起了一帮人的热捧,大家几乎都认为它是深度学习在自然语言领域的一项了不起的应用,各种欢呼“深度学习在自然语言领域开始发力 了”。 基于w...

深度学习word2vec笔记之算法篇

深度学习word2vec笔记之算法篇 标签: 深度学习word2veccbowskip-gram目标函数 2014-05-25 20:03 14080人阅读 评论(86) 收藏 举报 ...

文本挖掘深度学习之word2vec的R语言实现

笔者寄语:2013年末,Google发布的 word2vec工具引起了一帮人的热捧,大家几乎都认为它是深度学习在自然语言领域的一项了不起的应用,各种欢呼“深度学习在自然语言领域开始发力 了”。 基于...

深度学习word2vec笔记之应用篇

深度学习word2vec笔记之应用篇 声明: 1)该博文是Google专家以及多位博主所无私奉献的论文资料整理的。具体引用的资料请看参考文献。具体的版本声明也参考原文献 2)本文仅供学术交流,非商...

深度学习 word2vec(一)

一.前言 伴随着深度学习的大红大紫,只要是在自己的成果里打上 deep learning 字样,总会有 人去看。 深度学习可以称为当今机器学习领域的当之无愧的巨星, 也特别得到工业界的青睐。 ...

深度学习 word2vec (二)

在看 word2vec 的资料的时候,经常会被叫去看那几篇论文,而那几篇论文也没有系统地说明 word2vec 的具体原理和算法,这样看资料就没有得到应有的效果。 为了节省看无用资料的时间,就整理...

深度分析Word2vec 笔记 (必须收藏)

深度学习word2vec笔记之算法篇 原文:http://blog.csdn.net/mytestmy/article/details/26969149?utm_source=tuicool 1)...

深度学习笔记——Word2vec和Doc2vec原理理解并结合代码分析

一直在用Word2vec和Doc2vec做Embedding,但是刚开始用的时候对其原理一直是一知半解,只是知道怎么用而已。古人云:既要知其然,也要知其所以然。所以,结合作者论文,以及网上各位前辈的博...

文本深度表示模型—word2vec&doc2vec词向量模型

深度学习掀开了机器学习的新篇章,目前深度学习应用于图像和语音已经产生了突破性的研究进展。深度学习一直被人们推崇为一种类似于人脑结构的人工智能算法,那为什么深度学习在语义分析领域仍然没有实质性的进展呢?...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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