Java编程实现调用com操作Word方法实例代码

实例代码如下:

import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;
import com.jacob.com.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(3)); //禁用宏
    }
    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[1]).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 = 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));
  }
  /**
   * 从选定内容或插入点开始查找文本
   *
   * @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(0, ret.length()-1); //去掉最后的回车符;
    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 doc2 = null;
    try {
      doc2 = Dispatch.call(documents, "Open", anotherDocPath)
          .toDispatch();
      // 所有表格
      Dispatch tables = Dispatch.get(doc2, "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 (doc2 != null) {
        Dispatch.call(doc2, "Close", new Variant(saveOnExit));
        doc2 = null;
      }
    }
  }
  /**
   * 在当前文档指定的位置拷贝来自另一个文档中的图片
   *
   * @param anotherDocPath 另一个文档的磁盘路径
   * @param shapeIndex 被拷贝的图片在另一格文档中的位置
   * @param pos 当前文档指定的位置
   */
  public void copyImageFromAnotherDoc(String anotherDocPath, int shapeIndex,
      String pos) {
    Dispatch doc2 = null;
    try {
      doc2 = Dispatch.call(documents, "Open", anotherDocPath)
          .toDispatch();
      Dispatch shapes = Dispatch.get(doc2, "InLineShapes").toDispatch();
      Dispatch shape = Dispatch.call(shapes, "Item",
          new Variant(shapeIndex)).toDispatch();
      Dispatch imageRange = Dispatch.get(shape, "Range").toDispatch();
      Dispatch.call(imageRange, "Copy");
      if (this.find(pos)) {
        Dispatch textRange = Dispatch.get(selection, "Range")
            .toDispatch();
        Dispatch.call(textRange, "Paste");
      }
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      if (doc2 != null) {
        Dispatch.call(doc2, "Close", new Variant(saveOnExit));
        doc2 = null;
      }
    }
  }
  /**
   * 创建表格
   *
   * @param pos
   *      位置
   * @param cols
   *      列数
   * @param rows
   *      行数
   */
  public void createTable(String pos, int numCols, int numRows) {
    if (find(pos)) {
      Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
      Dispatch range = Dispatch.get(selection, "Range").toDispatch();
      @SuppressWarnings("unused")
      Dispatch newTable = Dispatch.call(tables, "Add", range,
          new Variant(numRows), new Variant(numCols)).toDispatch();
      Dispatch.call(selection, "MoveRight");
    } else {
      Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
      Dispatch range = Dispatch.get(selection, "Range").toDispatch();
      @SuppressWarnings("unused")
      Dispatch newTable = Dispatch.call(tables, "Add", range,
          new Variant(numRows), new Variant(numCols)).toDispatch();
      Dispatch.call(selection, "MoveRight");
    }
  }
  /**
   * 在指定行前面增加行
   *
   * @param tableIndex
   *      word文件中的第N张表(从1开始)
   * @param rowIndex
   *      指定行的序号(从1开始)
   */
  public void addTableRow(int tableIndex, int rowIndex) {
    // 所有表格
    Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
    // 要填充的表格
    Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex))
        .toDispatch();
    // 表格的所有行
    Dispatch rows = Dispatch.get(table, "Rows").toDispatch();
    Dispatch row = Dispatch.call(rows, "Item", new Variant(rowIndex))
        .toDispatch();
    Dispatch.call(rows, "Add", new Variant(row));
  }
  /**
   * 在第1行前增加一行
   *
   * @param tableIndex
   * word文档中的第N张表(从1开始)
   */
  public void addFirstTableRow(int tableIndex) {
    // 所有表格
    Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
    // 要填充的表格
    Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex))
        .toDispatch();
    // 表格的所有行
    Dispatch rows = Dispatch.get(table, "Rows").toDispatch();
    Dispatch row = Dispatch.get(rows, "First").toDispatch();
    Dispatch.call(rows, "Add", new Variant(row));
  }
  /**
   * 在最后1行前增加一行
   *
   * @param tableIndex
   *      word文档中的第N张表(从1开始)
   */
  public void addLastTableRow(int tableIndex) {
    // 所有表格
    Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
    // 要填充的表格
    Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex))
        .toDispatch();
    // 表格的所有行
    Dispatch rows = Dispatch.get(table, "Rows").toDispatch();
    Dispatch row = Dispatch.get(rows, "Last").toDispatch();
    Dispatch.call(rows, "Add", new Variant(row));
  }
  /**
   * 增加一行
   *
   * @param tableIndex
   *      word文档中的第N张表(从1开始)
   */
  public void addRow(int tableIndex) {
    Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
    // 要填充的表格
    Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex))
        .toDispatch();
    // 表格的所有行
    Dispatch rows = Dispatch.get(table, "Rows").toDispatch();
    Dispatch.call(rows, "Add");
  }
  /**
   * 增加一列
   *
   * @param tableIndex
   *      word文档中的第N张表(从1开始)
   */
  public void addCol(int tableIndex) {
    // 所有表格
    Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
    // 要填充的表格
    Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex))
        .toDispatch();
    // 表格的所有行
    Dispatch cols = Dispatch.get(table, "Columns").toDispatch();
    Dispatch.call(cols, "Add").toDispatch();
    Dispatch.call(cols, "AutoFit");
  }
  /**
   * 在指定列前面增加表格的列
   *
   * @param tableIndex
   *      word文档中的第N张表(从1开始)
   * @param colIndex
   *      制定列的序号 (从1开始)
   */
  public void addTableCol(int tableIndex, int colIndex) {
    // 所有表格
    Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
    // 要填充的表格
    Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex))
        .toDispatch();
    // 表格的所有行
    Dispatch cols = Dispatch.get(table, "Columns").toDispatch();
    System.out.println(Dispatch.get(cols, "Count"));
    Dispatch col = Dispatch.call(cols, "Item", new Variant(colIndex))
        .toDispatch();
    // Dispatch col = Dispatch.get(cols, "First").toDispatch();
    Dispatch.call(cols, "Add", col).toDispatch();
    Dispatch.call(cols, "AutoFit");
  }
  /**
   * 在第1列前增加一列
   *
   * @param tableIndex
   *      word文档中的第N张表(从1开始)
   */
  public void addFirstTableCol(int tableIndex) {
    Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
    // 要填充的表格
    Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex))
        .toDispatch();
    // 表格的所有行
    Dispatch cols = Dispatch.get(table, "Columns").toDispatch();
    Dispatch col = Dispatch.get(cols, "First").toDispatch();
    Dispatch.call(cols, "Add", col).toDispatch();
    Dispatch.call(cols, "AutoFit");
  }
  /**
   * 在最后一列前增加一列
   *
   * @param tableIndex
   *      word文档中的第N张表(从1开始)
   */
  public void addLastTableCol(int tableIndex) {
    Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
    // 要填充的表格
    Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex))
        .toDispatch();
    // 表格的所有行
    Dispatch cols = Dispatch.get(table, "Columns").toDispatch();
    Dispatch col = Dispatch.get(cols, "Last").toDispatch();
    Dispatch.call(cols, "Add", col).toDispatch();
    Dispatch.call(cols, "AutoFit");
  }
  /**
   * 自动调整表格
   *
   */
  @SuppressWarnings("deprecation")
  public void autoFitTable() {
    Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
    int count = Dispatch.get(tables, "Count").toInt();
    for (int i = 0; i < count; i++) {
      Dispatch table = Dispatch.call(tables, "Item", new Variant(i + 1))
          .toDispatch();
      Dispatch cols = Dispatch.get(table, "Columns").toDispatch();
      Dispatch.call(cols, "AutoFit");
    }
  }
  /**
   * 调用word里的宏以调整表格的宽度,其中宏保存在document下
   *
   */
  @SuppressWarnings("deprecation")
  public void callWordMacro() {
    Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
    int count = Dispatch.get(tables, "Count").toInt();
    Variant vMacroName = new Variant("Normal.NewMacros.tableFit");
    @SuppressWarnings("unused")
    Variant vParam = new Variant("param1");
    @SuppressWarnings("unused")
    Variant para[] = new Variant[] { vMacroName };
    for (int i = 0; i < count; i++) {
      Dispatch table = Dispatch.call(tables, "Item", new Variant(i + 1))
          .toDispatch();
      Dispatch.call(table, "Select");
      Dispatch.call(word, "Run", "tableFitContent");
    }
  }
  /**
   * 设置当前选定内容的字体
   *
   * @param boldSize
   * @param italicSize
   * @param underLineSize
   *      下划线
   * @param colorSize
   *      字体颜色
   * @param size
   *      字体大小
   * @param name
   *      字体名称
   */
  public void setFont(boolean bold, boolean italic, boolean underLine,
      String colorSize, String size, String name) {
    Dispatch font = Dispatch.get(selection, "Font").toDispatch();
    Dispatch.put(font, "Name", new Variant(name));
    Dispatch.put(font, "Bold", new Variant(bold));
    Dispatch.put(font, "Italic", new Variant(italic));
    Dispatch.put(font, "Underline", new Variant(underLine));
    Dispatch.put(font, "Color", colorSize);
    Dispatch.put(font, "Size", size);
  }
  /**
   * 设置单元格被选中
   *
   * @param tableIndex
   * @param cellRowIdx
   * @param cellColIdx
   */
  public void setTableCellSelected(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");
  }
  /**
   * 设置选定单元格的垂直对起方式, 请使用setTableCellSelected选中一个单元格
   * @param align 0-顶端, 1-居中, 3-底端
   */
  public void setCellVerticalAlign(int verticalAlign){
    Dispatch cells = Dispatch.get(selection, "Cells").toDispatch();
    Dispatch.put(cells, "VerticalAlignment", new Variant(verticalAlign));
  }
  /**
   * 设置当前文档中所有表格水平居中方式及其它一些格式,用在将word文件转化为html中,针对申报表
   */
  @SuppressWarnings("deprecation")
  public void setApplyTableFormat(){
    Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
    int tabCount = Integer.valueOf(Dispatch.get(tables, "Count").toString());  //System.out.println(tabCount);
    System.out.println("*******************************************************");
    for(int i=1; i<=tabCount; i++){
      Dispatch table = Dispatch.call(tables, "Item", new Variant(i)).toDispatch();
      Dispatch rows = Dispatch.get(table, "Rows").toDispatch(); 

      if(i==1){
        Dispatch.put(rows, "Alignment", new Variant(2));  //1-居中,2-Right
        continue ;
      }
      Dispatch.put(rows, "Alignment", new Variant(1));  //1-居中
      Dispatch.call(table, "AutoFitBehavior", new Variant(1));//设置自动调整表格方式,1-根据窗口自动调整
      Dispatch.put(table, "PreferredWidthType", new Variant(1));
      Dispatch.put(table, "PreferredWidth", new Variant(700));
      System.out.println(Dispatch.get(rows, "HeightRule").toString());
      Dispatch.put(rows, "HeightRule", new Variant(1));  //0-自动wdRowHeightAuto,1-最小值wdRowHeightAtLeast, 2-固定wdRowHeightExactly
      Dispatch.put(rows, "Height", new Variant(0.04*28.35));
      //int oldAlign = Integer.valueOf(Dispatch.get(rows, "Alignment").toString());
      //System.out.println("Algin:" + oldAlign);
    }
  }
  /**
   * 设置段落格式
   *
   * @param alignment
   *     0-左对齐, 1-右对齐, 2-右对齐, 3-两端对齐, 4-分散对齐
   * @param lineSpaceingRule
   * @param lineUnitBefore
   * @param lineUnitAfter
   * @param characterUnitFirstLineIndent
   */
  public void setParagraphsProperties(int alignment, int lineSpaceingRule,
      int lineUnitBefore, int lineUnitAfter, int characterUnitFirstLineIndent){
    Dispatch paragraphs = Dispatch.get(selection, "Paragraphs").toDispatch();
    Dispatch.put(paragraphs, "Alignment", new Variant(alignment));       //对齐方式
    Dispatch.put(paragraphs, "LineSpacingRule", new Variant(lineSpaceingRule)); //行距
    Dispatch.put(paragraphs, "LineUnitBefore", new Variant(lineUnitBefore));  //段前
    Dispatch.put(paragraphs, "LineUnitAfter", new Variant(lineUnitAfter));   //段后
    Dispatch.put(paragraphs, "CharacterUnitFirstLineIndent",
        new Variant(characterUnitFirstLineIndent));             //首行缩进字符数
  }
  /**
   * 设置当前段落格式, 使用前,请先选中段落
   */
  public void getParagraphsProperties(){
    Dispatch paragraphs = Dispatch.get(selection, "Paragraphs").toDispatch();
    String val = Dispatch.get(paragraphs, "LineSpacingRule").toString();  //行距
    val = Dispatch.get(paragraphs, "Alignment").toString();     //对齐方式
    val = Dispatch.get(paragraphs, "LineUnitBefore").toString();  //段前行数
    val = Dispatch.get(paragraphs, "LineUnitAfter").toString();   //段后行数
    val = Dispatch.get(paragraphs, "FirstLineIndent").toString();  //首行缩进
    val = Dispatch.get(paragraphs, "CharacterUnitFirstLineIndent").toString(); //首行缩进字符数
  }
  /**
   * 文件保存或另存为
   *
   * @param savePath
   *      保存或另存为路径
   */
  public void save(String savePath) {
    Dispatch.call(Dispatch.call(word, "WordBasic").getDispatch(),
        "FileSaveAs", savePath);
  }
  /**
   * 文件保存为html格式
   *
   * @param savePath
   * @param htmlPath
   */
  public void saveAsHtml(String htmlPath){
    Dispatch.invoke(doc,"SaveAs", Dispatch.Method,
        new Object[]{htmlPath, new Variant(8)}, new int[1]);
  }
  /**
   * 关闭文档
   *@param val 0不保存修改 -1 保存修改 -2 提示是否保存修改
   */
  public void closeDocument(int val) {
    Dispatch.call(doc, "Close", new Variant(val));
    doc = null;
  }
  /**
   * 关闭当前word文档
   *
   */
  public void closeDocument() {
    if (doc != null) {
      Dispatch.call(doc, "Save");
      Dispatch.call(doc, "Close", new Variant(saveOnExit));
      doc = null;
    }
  }
  public void closeDocumentWithoutSave(){
    if (doc != null) {
      Dispatch.call(doc, "Close", new Variant(false));
      doc = null;
    }
  }
  /**
   * 关闭全部应用
   *
   */
  public void close() {
    //closeDocument();
    if (word != null) {
      Dispatch.call(word, "Quit");
      word = null;
    }
    selection = null;
    documents = null;
  }
  /**
   * 打印当前word文档
   *
   */
  public void printFile() {
    if (doc != null) {
      Dispatch.call(doc, "PrintOut");
    }
  }
  /**
   * 保护当前档,如果不存在, 使用expression.Protect(Type, NoReset, Password)
   *
   * @param pwd
   * WdProtectionType 可以是下列 WdProtectionType 常量之一:
   *   1-wdAllowOnlyComments, 2-wdAllowOnlyFormFields, 0-wdAllowOnlyRevisions,
   *   -1-wdNoProtection, 3-wdAllowOnlyReading
   *
   * 使用参照 main1()
   */
  public void protectedWord(String pwd){
    String protectionType = Dispatch.get(doc, "ProtectionType").toString();
    if(protectionType.equals("-1")){
      Dispatch.call(doc, "Protect", new Variant(3), new Variant(true), pwd);
    }
  }
  /**
   * 解除文档保护,如果存在
   * @param pwd
   * WdProtectionType 常量之一(Long 类型,只读):
   *   1-wdAllowOnlyComments,2-wdAllowOnlyFormFields、
   *   0-wdAllowOnlyRevisions,-1-wdNoProtection, 3-wdAllowOnlyReading
   *
   *   使用参照 main1()
   */
  public void unProtectedWord(String pwd){
    String protectionType = Dispatch.get(doc, "ProtectionType").toString();
    if(protectionType.equals("3")){
      Dispatch.call(doc, "Unprotect", pwd);
    }
  }
  /**
   * 设置word文档安全级别
   * @param value
   *   1-msoAutomationSecurityByUI 使用“安全”对话框指定的安全设置。
   *   2-msoAutomationSecurityForceDisable 在程序打开的所有文件中禁用所有宏,而不显示任何安全提醒。
   *   3-msoAutomationSecurityLow 启用所有宏,这是启动应用程序时的默认值。
   */
  public void setAutomationSecurity(int value){
    word.setProperty("AutomationSecurity", new Variant(value));
  }
  /**
   * 读取文档中第paragraphsIndex段文字的内容;
   * @param paragraphsIndex
   * @return
   */
  public String getParagraphs(int paragraphsIndex){
    String ret = "";
    Dispatch paragraphs = Dispatch.get(doc, "Paragraphs").toDispatch(); // 所有段落
    int paragraphCount = Dispatch.get(paragraphs, "Count").getInt();      // 一共的段落数
    Dispatch paragraph = null;
    Dispatch range = null;
    if(paragraphCount > paragraphsIndex && 0 < paragraphsIndex){
      paragraph = Dispatch.call(paragraphs, "Item", new Variant(paragraphsIndex)).toDispatch();
      range = Dispatch.get(paragraph, "Range").toDispatch();
      ret = Dispatch.get(range, "Text").toString();
    }
    return ret;
  }
  /**
   * 设置页眉文字
   * @param cont
   * @return
   *
   * Sub AddHeaderText()
   * '设置页眉或页脚中的文字
   * '由 Headers、Footers 和 HeaderFooter 属性返回 HeaderFooter 对象。下列示例更改当前页眉中的文字。
   * With ActiveDocument.ActiveWindow.View
   *   .SeekView = wdSeekCurrentPageHeader
   *   Selection.HeaderFooter.Range.Text = "Header text"
   *   .SeekView = wdSeekMainDocument
   * End With
   * End Sub
   */
  public void setHeaderContent(String cont){
    Dispatch activeWindow = Dispatch.get(doc, "ActiveWindow").toDispatch();
    Dispatch view = Dispatch.get(activeWindow, "View").toDispatch();
    //Dispatch seekView = Dispatch.get(view, "SeekView").toDispatch();
    Dispatch.put(view, "SeekView", new Variant(9));     //wdSeekCurrentPageHeader-9 

    Dispatch headerFooter = Dispatch.get(selection, "HeaderFooter").toDispatch();
    Dispatch range = Dispatch.get(headerFooter, "Range").toDispatch();
    Dispatch.put(range, "Text", new Variant(cont));
    //String content = Dispatch.get(range, "Text").toString();
    Dispatch font = Dispatch.get(range, "Font").toDispatch(); 

    Dispatch.put(font, "Name", new Variant("楷体_GB2312"));
    Dispatch.put(font, "Bold", new Variant(true));
    //Dispatch.put(font, "Italic", new Variant(true));
    //Dispatch.put(font, "Underline", new Variant(true));
    Dispatch.put(font, "Size", 9);
    Dispatch.put(view, "SeekView", new Variant(0));     //wdSeekMainDocument-0恢复视图;
  }
  public static void main(String[] args)throws Exception{
    WordBean word = new WordBean();
    word.openDocument("D:/竞价平台.doc");
    word.setHeaderContent("*****************88设置页眉内容11111111111111111!");
    //word.unProtectedWord("1qaz");
    //word.protectedWord("123");
    System.out.print(word.getParagraphs(3));
    word.closeDocument();
    word.close();
  }
}

//更新目录并自动保存办法

/**启动word进程*/
     ActiveXComponent app = new ActiveXComponent("Word.Application");
     app.setProperty("Visible", new Variant(false));
     Dispatch docs = app.getProperty("Documents").toDispatch();
     /**打开word文档*/
     Dispatch doc = Dispatch.invoke(docs, "Open", Dispatch.Method, new Object[] { "D:/aaa/a.doc", new Variant(false),
             new Variant(false) }, new int[1]).toDispatch();
     Dispatch activeDocument = app.getProperty("ActiveDocument").toDispatch();
     /**获取目录*/
     Dispatch tablesOfContents = Dispatch.get(activeDocument,"TablesOfContents").toDispatch();
     /**获取第一个目录。若有多个目录,则传递对应的参数*/
     Variant tablesOfContent = Dispatch.call(tablesOfContents, "Item", new Variant(1));
     /**更新目录,有两个方法:Update 更新域,UpdatePageNumbers 只更新页码*/
     Dispatch toc = tablesOfContent.toDispatch();
     toc.call(toc, "Update");
     /**另存为*/
     /**关闭word文档*/
     Dispatch.call(doc, "Save");
     Dispatch.call(doc, "Close", new Variant(-1));
     /**退出word进程*/
     app.invoke("Quit", new Variant[] {});

总结:

本文关于Java编程实现调用com操作Word方法的介绍就到这里,希望对大家有所帮助。如果有什么问题可以留言,小编会及时回复大家的。

(0)

相关推荐

  • Java用freemarker导出word实用示例

    最近一个项目要导出word文档,折腾老半天,发现还是用freemarker的模板来搞比较方便省事,现总结一下关键步骤,供大家参考,这里是一个简单的试卷生成例子. 一.模板的制作 先用Word做一个模板,如下图: (注意,上面是有表格的,我设置了边框不可见)然后另存为XML文件,之后用工具打开这个xml文件,有人用firstobject XML Editor感觉还不如notepad++,我这里用notepad++,主要是有高亮显示,和元素自动配对,效果如下: 上面黑色的地方基本是我们之后要替换的地

  • java Apache poi 对word doc文件进行读写操作

    使用POI读写Word doc文件 Apache poi的hwpf模块是专门用来对word doc文件进行读写操作的.在hwpf里面我们使用HWPFDocument来表示一个word doc文档.在HWPFDocument里面有这么几个概念: Range:它表示一个范围,这个范围可以是整个文档,也可以是里面的某一小节(Section),也可以是某一个段落(Paragraph),还可以是拥有共同属性的一段文本(CharacterRun).   Section:word文档的一个小节,一个word文

  • Java使用poi将word转换为html

    使用poi将word转换为html,支持doc,docx,转换后可以保持图片.样式. 1.导入Maven包 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.14</version> </dependency> <dependency> <groupId>org.a

  • 实例讲解Java读取一般文本文件和word文档的方法

    一般文本文件 我们以日志文件.log文件为例: import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; public class File_Test { /** * @param args */ pub

  • Java编程实现调用com操作Word方法实例代码

    实例代码如下: import com.jacob.activeX.ActiveXComponent; import com.jacob.com.Dispatch; import com.jacob.com.Variant; /** * jacob操作MSword类 * @author */ public class WordBean { // word文档 private Dispatch doc; // word运行程序对象 private ActiveXComponent word; //

  • Java类和成员上的一些方法实例代码

    isInstance和isAssignableFrom obj instanceof Class 判断obj是不是Class或者Class的子类的实例 clazz.isInstance(obj) 判断obj能不能强制转换成clazz类型,亦即obj是不是clazz或者clazz的子类的实例 clazz1.isAssignableFrom(clazz2) 如果clazz2和clazz1相同,或者clazz1是clazz2的父类则返回True,否则返回Flase static class Paren

  • Java编程实现二项分布的采样或抽样实例代码

    本文研究的主要是Java编程实现二项分布的采样或抽样,下面是具体实现代码. 如下程序为n=100,p=0.9的二项分布采样,共采样10000次 package function; import org.apache.commons.math3.distribution.BetaDistribution; import org.apache.commons.math3.distribution.BinomialDistribution; import org.apache.commons.math

  • Java追加文件内容的三种方法实例代码

    整理文档,搜刮出一个Java追加文件内容的三种方法的代码,稍微整理精简一下做下分享. import Java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.RandomAccessFile;

  • Java中求最大值的4种方法实例代码

    前言 本文主要给大家分享了关于java求最大值的4中方法,文中给出了完整的示例代码,下面话不多少了,来一起看看吧 示例代码: /** *@author Prannt *求最大值(或最小值) *本例以int数据类型为例,可指定其他数据类型 */ //方法一:直接法,求最小值类似 public class Deno05ArrayMax { public static void main(String[] args) { //数据类型可指定 int [] array = {5,15,20,30,100

  • vue3 setup中父组件通过Ref调用子组件的方法(实例代码)

    目录 在setup()钩子函数中调用 在<srcipt setup>中调用 在setup()钩子函数中调用 父组件 <template> <div> 我是父组件 <children ref="childrenRef" /> <button @click="handleChildren">触发子组件</button> </div> </template> <scrip

  • java编程实现邮件定时发送的方法

    本文实例讲述了java编程实现邮件定时发送的方法.分享给大家供大家参考,具体如下: 最近做项目时客户提出了一个需求:系统定时发送E-mail到其客户,达到通知的效果.先将实例分享给大家,如果确实有一些帮助的话,请大家来点掌声! 首先介绍java定时器(java.util.Timer)有定时执行计划任务的功能,通过设定定时器的间隔时间,会自动在此间隔时间后执行预先安排好的任务(java.util. TimerTask) 如: 每隔一个小时执行任务 timer.schedule(TimerTask,

  • Java编程获取当前屏幕分辨率的方法示例

    本文实例讲述了Java编程获取当前屏幕分辨率的方法.分享给大家供大家参考,具体如下: /** * This class implements the functionality of fetching the size of the screen */ package com.leo.util; /** * @author Leo Share * @since 07/16/2007 * @version 1.0 */ class ScreenSize{ private int screenWid

  • JAVA编程实现UDP网络通讯的方法示例

    本文实例讲述了JAVA编程实现UDP网络通讯的方法.分享给大家供大家参考,具体如下: UDP协议全称是用户数据报协议,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议. 在OSI模型中,在第四层--传输层,处于IP协议的上一层.UDP有不提供数据包分组.组装和不能对数据包进行排序的缺点: 也就是说,当报文发送之后,是无法得知其是否安全完整到达的.UDP用来支持那些需要在计算机之间传输数据的网络应用. 采用UDP协议要先把数据定义成数据报(Datagram)并在数据报中指明数据所要达到

  • JAVA编程实现TCP网络通讯的方法示例

    本文实例讲述了JAVA编程实现TCP网络通讯的方法.分享给大家供大家参考,具体如下: TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议. 由IETF的RFC 793定义,在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能. 基于TCP网络通讯实现的类主要有服务器端的ServerSocket用客户端的Socket. 通讯流程: 打开服务器,等待客户端连接-->客户端连接上服务器-->数据通讯. 代码

随机推荐