`
liubey
  • 浏览: 107213 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

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编辑器,辅助功能,都能发掘出来。

分享到:
评论

相关推荐

    JAVA 深度控制WORD带完整样例

    这就引出了我们今天要讨论的主题——"JAVA 深度控制WORD带完整样例"。 JACOB(Java COM Bridge)是一个Java库,它为Java开发者提供了与COM组件交互的能力,包括Microsoft Word。JACOB通过JNI(Java Native ...

    java深度处理word.doc

    Java深度处理Word文档是指使用Java语言操作Microsoft Word文档的技术,本文将详细介绍如何使用Java语言来操作Word文档,包括创建新的Word文档、打开已存在的Word文档、编辑Word文档等操作。 Java操作Word文档的原理...

    Word2Vec java版实现

    Deeplearning4j是一个开源的深度学习库,它提供了Word2Vec的训练和应用API。 - `Word2VEC_java-master`可能包含一个完整的项目结构,包括源代码、示例数据和测试用例。通常,项目会包含训练模型的类,如`Word2...

    java深入操作word

    ### Java 深度操作 Word 的技术解析与实践 #### 技术背景及引入 在企业级应用开发中,经常需要处理文档自动化任务,如批量生成报告、合同模板填充等。传统的做法通常依赖于服务器端的脚本或者专门的办公软件来完成...

    java解析word文件的相关代码

    - 如果需要处理多个位于不同目录下的Word文件,可以通过编写递归函数来实现深度遍历文件夹结构,并对每个Word文件执行文本提取操作。 - **文本内容的保存**: - 提取的文本内容不仅可以打印到控制台,还可以保存到...

    java实现PDF转word

    SWT是Eclipse开源组织提供的一款轻量级、高性能的Java图形用户界面库,它提供了与本机操作系统深度集成的控件。 PDF转Word的核心在于解析PDF文件的内容,包括文字、图像和排版等,并将这些元素重构到Word文档中。在...

    java深度处理[收集].pdf

    Java深度处理Word主要涉及到使用Jacob库来实现对Microsoft Word的操作。Jacob是一个Java-COM桥接器,它允许Java代码调用COM组件,如Microsoft Office应用程序,包括Word。在这个场景中,我们将探讨如何使用Jacob来...

    thinking in java word版

    1. **Java基础**:介绍Java的基本语法,如变量、数据类型、控制结构、函数、类和对象等,帮助读者构建扎实的Java编程基础。 2. **面向对象编程**:深入讲解面向对象编程的基本概念,如封装、继承、多态,以及如何...

    基于java 的深度学习框架DL4J

    DL4J是一款功能强大的Java深度学习框架,不仅支持高效的模型训练,还提供了完整的生态系统,涵盖了从数据预处理到模型训练再到部署的全流程。无论是对于初学者还是经验丰富的开发者而言,DL4J都是一个值得深入探索的...

    Word2VEC_java-master

    Word2Vec是由Google的Tomas Mikolov等人提出的一种深度学习方法,它能够将单词转换为连续的向量空间中的数值表示,使得在该空间中,相似的单词在几何上距离相近。这个项目是Java版本的实现,对于那些偏好Java平台的...

    java深度历险2

    《Java深度历险2》是一本专为Java开发者深度探索JDK而编写的教程,它旨在揭示JDK的内部工作原理,帮助读者更好地理解和优化Java应用程序。这本书通过深入讲解Java平台的核心机制,提供了宝贵的洞见,使开发者能够...

    java深度历险(繁体)

    《Java深度历险》是一本全面探讨Java技术的书籍,主要涵盖了Java 2 SDK的深入解析,类别载入器的工作原理,Java与Microsoft Office的集成,如何利用Visual Studio .NET来操控Java虚拟机(JVM),以及Java的package与...

    Java深度历险

    《Java深度历险》这本书是Java开发者的一本宝贵资源,它深入探讨了如何利用Java语言进行Word和Excel等文档处理的技术。在Java的世界里,处理这些常见办公文档格式的能力是必不可少的,尤其在数据处理、报表生成以及...

    记录一下 Java 代码实现文件夹、文件的对比,主要包含 word、pdf、文本、图片等相关文件的对比计算,以及计算文本的相似率

    在Java编程中,对比文件夹和文件是一项常见的需求,尤其在文档管理和版本控制中。本篇文章将探讨如何使用Java实现这一功能,特别是针对word、pdf、文本和图片等类型的文件进行对比计算,以及如何计算文本的相似率和...

    java操作word-jacob

    总的来说,Java操作Word-Jacob是一种有效的技术,特别适合那些需要在Java环境中处理大量Word文档或者需要对Word文档进行深度定制的应用场景。不过,需要根据项目需求和目标平台来权衡选择哪种方法最合适。

    Java深度历险(Office,ant相关)

    Java深度历险是一次探索Java开发的深层次之旅,它涵盖了Java与Microsoft Office的集成,以及Ant构建工具的使用。在Java编程的世界里,深入理解语言的内在机制、库的运用以及与其他系统的交互能力是至关重要的。这篇...

    java学习文档(word)

    其次,"100行Java代码构建一个线程池.doc"这部分内容可能涉及到Java并发编程的深度讨论。线程池是管理线程的一种高效方式,它可以避免频繁创建和销毁线程带来的开销。文档可能会详细解释如何使用Java的...

    疯狂java实战演义(书)(WORD版)

    《疯狂Java实战演义》是一本深度探讨Java编程技术的实战型书籍,旨在帮助读者通过实际操作和案例分析掌握Java编程的核心概念与实践技巧。这本书共分为15个章节,覆盖了从Java语言基础到高级特性的广泛内容,是Java...

Global site tag (gtag.js) - Google Analytics