问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Java调用com组件操作word使用总结

发布网友 发布时间:2023-05-18 17:13

我来回答

1个回答

热心网友 时间:2023-10-05 10:31

  一 准备工作

  先了解一下概念 JACOB 就是 JAVA Bridge的缩写 提供自动化的访问的功能 也是通过JNI功能访问windows平台下的组件或者win 系统库的 这是一个开始于 年的开源项目的成果 有很多使用者对该项目进行了修改 做出了自己的贡献

  Jacob下载地址 ?group_id= &package_id=

  我在这里下载了Jacob 和jacob 的版本两个版本

  这里下载的是目前最新的Jacob 的Release版

  另外java操作word方式还有(个人认为通过jacob最好 自己可以扩展 网上除poi之外几乎全是java 技术实现的):

  ( ):Apache POI Java API To Access Microsoft Format Files();对word处理不够强处理Excel功能可以 但是全是通过java完成的 不需 要组件支持;

  ( ):java word 是一个在java程序中调用 MS Office Word 文档的组件(类库) 该组件提供了一组简单的接口 以便java程序调用他的服务操作Word 文档 (好象也是用的java 技术);

  ( )web开发语言操作word的功能最好还是用第三方的控件 看看这个SOAOFFICE 还可以使用js 写VBA呢

  二 安装Jacob

  Jacob的安装非常的简单 我们解开下载的jacob_ zip 在文件夹中找到jacob dll和jacob jar两个文件 如果是 Jacob 则是jacob x dll( 位 机和jacob x dll( 位)和 jacob jar两个文件 Jacob dll直接放到系统的system 文件夹下就行了 连注册都不用的(或者拷贝到jdk或者jre的bin目 录下也行 当前测试文件所在的目录也行 就是只要在java library path中就可以) 而jacob jar设置到classpath中去就 可以了 或者在IDE开发环境的工程中设置扩展库也一样的 我是这样使用的将jacob x dll或复制 到%Tomcat %\bin目录下将jacob jar复制到%Tomcot %\Share\lib目录下 我使用过程中感觉放到这里是一个最终解决 办法 当你放哪都有问题的时候 我这样用之后再没有出过因为系统不一样出现的各种各样的问题 当然你作的是web的项目

  注意使用jacob一写要安装word 我装的word 如果是操作word 就不用jacob了(好像这方面的API)

  对jacob dll几种配置方法 (网上看到)

   : :

   把jacob dll文件 复制到 windows\system 目录下 (注 我用的时候这个方法不能运行)

   把jacob dll放入 Java\jdk _ \jre\bin目录下 把jacob jar放入 Java\jdk _ \jre\lib\ext目录下 可以正常运行

   把jacob dll放入 \glc\src目录下 把jacob jar放入WEB INF\lib目录下 也是可以正常运行

  三 使用(以下是我改写的一个word操作类 希望有兴趣的朋友完善 记得发给我一份)

  //注意java操作word关键是定位操作对象;

  import jacob activeX ActiveXComponent;

  import Dispatch;

  import Variant;

  /**

  * jacob操作MSword类

  * @author

  */

  public class WordBean {

  // word文档

  private Dispatch doc;

  // word运行程序对象

  private ActiveXComponent word;

  // 所有word文档集合

  private Dispatch documents;

  // 选定的范围或插入点

  private Dispatch selection;

  private boolean saveOnExit = true;

  public WordBean()throws Exception{

  if (word == null) {

  word = new ActiveXComponent( Word Application );

  word setProperty( Visible new Variant(false)); //不可见打开word

  word setProperty( AutomationSecurity new Variant( )); //禁用宏

  }

  if (documents == null)

  documents = word getProperty( Documents ) toDispatch();

  }

  /**

  * 设置退出时参数

  *

  * @param saveOnExit

  * boolean true 退出时保存文件 false 退出时不保存文件

  */

  public void setSaveOnExit(boolean saveOnExit) {

  this saveOnExit = saveOnExit;

  }

  /**

  * 创建一个新的word文档

  *

  */

  public void createNewDocument() {

  doc = Dispatch call(documents Add ) toDispatch();

  selection = Dispatch get(word Selection ) toDispatch();

  }

  /**

  * 打开一个已存在的文档

  *

  * @param docPath

  */

  public void openDocument(String docPath) {

  closeDocument();

  doc = Dispatch call(documents Open docPath) toDispatch();

  selection = Dispatch get(word Selection ) toDispatch();

  }

  /**

  *只读 打开一个保护文档

  * @param docPath 文件全名

  * @param pwd 密码

  */

  public void openDocumentOnlyRead(String docPath String pwd)throws Exception {

  closeDocument();

  // doc = Dispatch invoke(documents Open Dispatch Method

  // new Object[]{docPath new Variant(false) new Variant(true) new Variant(true) pwd}

  // new int[ ]) toDispatch();//打开word文件

  doc = Dispatch callN(documents Open new Object[]{docPath new Variant(false)

  new Variant(true) new Variant(true) pwd new Variant(false)}) toDispatch();

  selection = Dispatch get(word Selection ) toDispatch();

  }

  public void openDocument(String docPath String pwd)throws Exception {

  closeDocument();

  doc = Dispatch callN(documents Open new Object[]{docPath new Variant(false)

  new Variant(false) new Variant(true) pwd}) toDispatch();

  selection = Dispatch get(word Selection ) toDispatch();

  }

  /**

  * 把选定的内容或插入点向上移动

  *

  * @param pos

  * 移动的距离

  */

  public void moveUp(int pos) {

  if (selection == null)

  selection = Dispatch get(word Selection ) toDispatch();

  for (int i = ; i < pos; i++)

  Dispatch call(selection MoveUp );

  }

  /**

  * 把选定的内容或者插入点向下移动

  *

  * @param pos

  * 移动的距离

  */

  public void moveDown(int pos) {

  if (selection == null)

  selection = Dispatch get(word Selection ) toDispatch();

  for (int i = ; i < pos; i++)

  Dispatch call(selection MoveDown );

  }

  /**

  * 把选定的内容或者插入点向左移动

  *

  * @param pos

  * 移动的距离

  */

  public void moveLeft(int pos) {

  if (selection == null)

  selection = Dispatch get(word Selection ) toDispatch();

  for (int i = ; i < pos; i++) {

  Dispatch call(selection MoveLeft );

  }

  }

  /**

  * 把选定的内容或者插入点向右移动

  *

  * @param pos

  * 移动的距离

  */

  public void moveRight(int pos) {

  if (selection == null)

  selection = Dispatch get(word Selection ) toDispatch();

  for (int i = ; i < pos; i++)

  Dispatch call(selection MoveRight );

  }

  /**

  * 把插入点移动到文件首位置

  *

  */

  public void moveStart() {

  if (selection == null)

  selection = Dispatch get(word Selection ) toDispatch();

  Dispatch call(selection HomeKey new Variant( ));

  }

  /**

  * 从选定内容或插入点开始查找文本

  *

  * @param toFindText

  * 要查找的文本

  * @return boolean true 查找到并选中该文本 false 未查找到文本

  */

  @SuppressWarnings( static access )

  public boolean find(String toFindText) {

  if (toFindText == null || toFindText equals( ))

  return false;

  // 从selection所在位置开始查询

  Dispatch find = word call(selection Find ) toDispatch();

  // 设置要查找的内容

  Dispatch put(find Text toFindText);

  // 向前查找

  Dispatch put(find Forward True );

  // 设置格式

  Dispatch put(find Format True );

  // 大小写匹配

  Dispatch put(find MatchCase True );

  // 全字匹配

  Dispatch put(find MatchWholeWord True );

  // 查找并选中

  return Dispatch call(find Execute ) getBoolean();

  }

  /**

  * 把选定选定内容设定为替换文本

  *

  * @param toFindText

  * 查找字符串

  * @param newText

  * 要替换的内容

  * @return

  */

  public boolean replaceText(String toFindText String newText) {

  if (!find(toFindText))

  return false;

  Dispatch put(selection Text newText);

  return true;

  }

  /**

  * 全局替换文本

  *

  * @param toFindText

  * 查找字符串

  * @param newText

  * 要替换的内容

  */

  public void replaceAllText(String toFindText String newText) {

  while (find(toFindText)) {

  Dispatch put(selection Text newText);

  Dispatch call(selection MoveRight );

  }

  }

  /**

  * 在当前插入点插入字符串

  *

  * @param newText

  * 要插入的新字符串

  */

  public void insertText(String newText) {

  Dispatch put(selection Text newText);

  }

  /**

  *

  * @param toFindText

  * 要查找的字符串

  * @param imagePath

  * 图片路径

  * @return

  */

  public boolean replaceImage(String toFindText String imagePath) {

  if (!find(toFindText))

  return false;

  Dispatch call(Dispatch get(selection InLineShapes ) toDispatch()

   AddPicture imagePath);

  return true;

  }

  /**

  * 全局替换图片

  *

  * @param toFindText

  * 查找字符串

  * @param imagePath

  * 图片路径

  */

  public void replaceAllImage(String toFindText String imagePath) {

  while (find(toFindText)) {

  Dispatch call(Dispatch get(selection InLineShapes ) toDispatch()

   AddPicture imagePath);

  Dispatch call(selection MoveRight );

  }

  }

  /**

  * 在当前插入点插入图片

  *

  * @param imagePath

  * 图片路径

  */

  public void insertImage(String imagePath) {

  Dispatch call(Dispatch get(selection InLineShapes ) toDispatch()

   AddPicture imagePath);

  }

  /**

  * 合并单元格

  *

  * @param tableIndex

  * @param fstCellRowIdx

  * @param fstCellColIdx

  * @param secCellRowIdx

  * @param secCellColIdx

  */

  public void mergeCell(int tableIndex int fstCellRowIdx int fstCellColIdx

  int secCellRowIdx int secCellColIdx) {

  // 所有表格

  Dispatch tables = Dispatch get(doc Tables ) toDispatch();

  // 要填充的表格

  Dispatch table = Dispatch call(tables Item new Variant(tableIndex))

   toDispatch();

  Dispatch fstCell = Dispatch call(table Cell

  new Variant(fstCellRowIdx) new Variant(fstCellColIdx))

   toDispatch();

  Dispatch secCell = Dispatch call(table Cell

  new Variant(secCellRowIdx) new Variant(secCellColIdx))

   toDispatch();

  Dispatch call(fstCell Merge secCell);

  }

  /**

  * 在指定的单元格里填写数据

  *

  * @param tableIndex

  * @param cellRowIdx

  * @param cellColIdx

  * @param txt

  */

  public void putTxtToCell(int tableIndex int cellRowIdx int cellColIdx

  String txt) {

  // 所有表格

  Dispatch tables = Dispatch get(doc Tables ) toDispatch();

  // 要填充的表格

  Dispatch table = Dispatch call(tables Item new Variant(tableIndex))

   toDispatch();

  Dispatch cell = Dispatch call(table Cell new Variant(cellRowIdx)

  new Variant(cellColIdx)) toDispatch();

  Dispatch call(cell Select );

  Dispatch put(selection Text txt);

  }

  /**

  * 获得指定的单元格里数据

  *

  * @param tableIndex

  * @param cellRowIdx

  * @param cellColIdx

  * @return

  */

  public String getTxtFromCell(int tableIndex int cellRowIdx int cellColIdx) {

  // 所有表格

  Dispatch tables = Dispatch get(doc Tables ) toDispatch();

  // 要填充的表格

  Dispatch table = Dispatch call(tables Item new Variant(tableIndex))

   toDispatch();

  Dispatch cell = Dispatch call(table Cell new Variant(cellRowIdx)

  new Variant(cellColIdx)) toDispatch();

  Dispatch call(cell Select );

  String ret = ;

  ret = Dispatch get(selection Text ) toString();

  ret = ret substring( ret length() ); //去掉最后的回车符;

  return ret;

  }

  /**

  * 在当前文档拷贝剪贴板数据

  * @param pos

  */

  public void pasteExcelSheet(String pos) {

  moveStart();

  if (this find(pos)) {

  Dispatch textRange = Dispatch get(selection Range ) toDispatch();

  Dispatch call(textRange Paste );

  }

  }

  /**

  * 在当前文档指定的位置拷贝表格

  *

  * @param pos

  * 当前文档指定的位置

  * @param tableIndex

  * 被拷贝的表格在word文档中所处的位置

  */

  public void copyTable(String pos int tableIndex) {

  // 所有表格

  Dispatch tables = Dispatch get(doc Tables ) toDispatch();

  // 要填充的表格

  Dispatch table = Dispatch call(tables Item new Variant(tableIndex))

   toDispatch();

  Dispatch range = Dispatch get(table Range ) toDispatch();

  Dispatch call(range Copy );

  if (this find(pos)) {

  Dispatch textRange = Dispatch get(selection Range ) toDispatch();

  Dispatch call(textRange Paste );

  }

  }

  /**

  * 在当前文档指定的位置拷贝来自另一个文档中的表格

  *

  * @param anotherDocPath

  * 另一个文档的磁盘路径

  * @param tableIndex

  * 被拷贝的表格在另一格文档中的位置

  * @param pos

  * 当前文档指定的位置

  */

  public void copyTableFromAnotherDoc(String anotherDocPath int tableIndex

  String pos) {

  Dispatch doc = null;

  try {

  doc = Dispatch call(documents Open anotherDocPath)

   toDispatch();

  // 所有表格

  Dispatch tables = Dispatch get(doc Tables ) toDispatch();

  // 要填充的表格

  Dispatch table = Dispatch call(tables Item

  new Variant(tableIndex)) toDispatch();

  Dispatch range = Dispatch get(table Range ) toDispatch();

  Dispatch call(range Copy );

  if (this find(pos)) {

  Dispatch textRange = Dispatch get(selection Range )

   toDispatch();

  Dispatch call(textRange Paste );

  }

  } catch (Exception e) {

  e printStackTrace();

  } finally {

  if (doc != null) {

  Dispatch call(doc Close new Variant(saveOnExit));

  doc = null;

  }

lishixin/Article/program/Java/hx/201311/26342
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
王卡专属免流包是什么意思 腾讯王卡专属流量是什么意思 人防临空墙排烟机房可以留洞吗? 瑞士转机的问题? 雅阁、第九代凯美瑞、迈腾,大空间的中级车推荐 云顶之弈双人排位介绍 金铲铲之战 金铲铲段位相差多少可以一起打? 现在上海办理居住证需要本人去吗 34周加5天是几个月 孕34周是几个月了 孕34周如何预防早产 永劫无间天海技能及战术搭配攻略 永劫无间新版阔刀技巧分享战斗心得介绍 梦见山上的神像活了的预兆 家里为什么会有飞蛾? 亚洲四小龙如何应对1997年金融危机 古代“太阳”“月亮”各用什么比喻? 为什么古人将太阳视为神明 世上有哪两种感情可以称之为浪漫的感情呢? 西汉中期以来的社会自治指的是()。 社会自治包括哪些治理 简述社会自治对法治的作用。 结婚的行为里面法律管哪些事情 婚姻上有两边管事的说法吗 梦见梦帮让人家看小孩的预兆 梦见帮朋友看孩子 预估运费是什么意思 速动比率是多少? 不愿回家的人:不是家乡贫瘠,是输在观念上的贫瘠 指南针上面&#39;nesw斗代表什么 发动机飞轮壳分为干式和湿式两种,他们的区别在那?应用起来有什么不同? 拼多多宝贝征集是真的吗 网店名称征集! 正确的硬盘分区大小 中学教材全解—九年级语文上的内容简介 为什么手机号码前总是显示01186 011开头是不是韩国的手机号码? 01110是哪国手机的开头号码? 跑完步后可以用平躺的方式来代替散步吗? JBL蓝牙音响按了电源键怎么又自动连接上了 什么是回连服务器地址 4007195555这个电话来推销保险,说得很诱人~有谁办过~感觉如何~ 晚上听见老鸹叫声好不好 为什么单位说不要滑头,却喜欢滑头 滑头的人的特点 处座男说好是什么意思 note9pro内存剩多少会卡顿 养花九盆好吗? 摆花放七盆可以吗 摆花最好养多少盆 南阳碧海云天国际水汇是干什么的 加都国际水汇怎么样?