x198767 2015-02-14 09:13 采纳率: 0%
浏览 2231

jacob的问题,我在操作word,替换文字的时候,第一次调用可以成功,第二次调用就没有效果了

package com.hundsun.cby.htblthsz;

import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.ComThread;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;

public class HtblthszUtil {
// word文档
private Dispatch doc;

// word运行程序对象
private ActiveXComponent word;

// 所有word文档集合
private Dispatch documents;

// 选定的范围或插入点
private Dispatch selection;

private boolean saveOnExit = true;

/** */
/**
 *
 * @param visible
 *            为true表示word应用程序可见
 */
public HtblthszUtil(boolean visible) {
    if (word == null) {
        word = new ActiveXComponent("Word.Application");
        word.setProperty("Visible", new Variant(visible));
    }
    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 pos
 *            移动的距离
 */
public void moveUp(int pos) {
    if (selection == null)
        selection = Dispatch.get(word, "Selection").toDispatch();
    for (int i = 0; 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 = 0; 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 = 0; 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 = 0; 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(6));
}

public void moveEnd() {
    if (selection == null)
        selection = Dispatch.get(word, "Selection").toDispatch();
    Dispatch.call(selection, "EndKey", new Variant(6));
}

/** */
/**
 * 从选定内容或插入点开始查找文本
 *
 * @param toFindText
 *            要查找的文本
 * @return boolean true-查找到并选中该文本,false-未查找到文本
 */
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);
}



/** */
/**
 * 关闭全部应用
 *
 */
public void close() {
    closeDocument();
    if (word != null) {
        Dispatch.call(word, "Quit");
        word = null;
    }
    selection = null;
    documents = null;

    ComThread.Release();
}

/** */
/**
 * 打印当前word文档
 *
 */
public void printFile() {
    if (doc != null) {
        Dispatch.call(doc, "PrintOut");
    }
}

public static void main(String args[]) throws Exception {

    HtblthszUtil msWordManager = new HtblthszUtil(false);
    msWordManager.openDocument("F:\\基础版-基金子公司(1).docx");
    msWordManager.replaceText("资产管理", "castiel计划");
    msWordManager.replaceText("123", "客户资产管理计划");
    msWordManager.moveEnd();
    msWordManager.close();

}

}

  • 写回答

4条回答 默认 最新

  • devmiao 2015-02-14 15:46
    关注

    检查下word进程有没有正确释放。

    评论

报告相同问题?

悬赏问题

  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!