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方法的介绍就到这里,希望对大家有所帮助。如果有什么问题可以留言,小编会及时回复大家的。

时间: 2017-09-18

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用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读取一般文本文件和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

C#实现简单合并word文档的方法

本文实例讲述了C#实现简单合并word文档的方法.分享给大家供大家参考.具体如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Reflection; namespace Demo { p

PHP读取word文档的方法分析【基于COM组件】

本文实例讲述了PHP读取word文档的方法.分享给大家供大家参考,具体如下: php开发 过程中可能会word文档的读取问题,这里可以利用com组件来完成此项操作 一.先开启php.ini的COM,操作如下 1. extension=php_com_dotnet.dll 2. com.allow_dcom = true 二.开启之后就可以试下如下操作 1.建立一个指向新COM组件的索引 $word = new COM("word.application") or die("C

python读取word文档的方法

本文实例讲述了python读取word文档的方法.分享给大家供大家参考.具体如下: 首先下载安装win32com from win32com import client as wc word = wc.Dispatch('Word.Application') doc = word.Documents.Open('c:/test') doc.SaveAs('c:/test.text', 2) doc.Close() word.Quit() 这种方式产生的text文档,不能用python用普通的r方

PHP创建word文档的方法(平台无关)

本文实例讲述了PHP创建word文档的方法.分享给大家供大家参考,具体如下: 关于用PHP生成word,在网上找了很多资料,有调用COM组件生成的,有安装PHP扩展生成的.都不免麻烦,以下为比较简洁的一种方法,且可跨平台. 以下为详细代码: class.word.php <?php class Word{ function start(){ ob_start(); //打开输出控制缓冲 echo '<html xmlns:o="urn:schemas-microsoft-com:of

C#实现通过模板自动创建Word文档的方法

本文实例讲述了C#实现通过模板自动创建Word文档的方法,是非常实用的技巧.分享给大家供大家参考.具体实现方法如下: 引言:前段时间有项目要用c#生成Word格式的计算报告,通过网络查找到很多内容,但是都很凌乱,于是自己决定将具体的步骤总结整理出来,以便于更好的交流和以后相似问题可以迅速的解决! 现通过具体的示例演示具体的步骤:   第一步,制作模板   1.新建一个文档,设置文档内容. 2.在相应位置插入书签:将鼠标定位到要插入书签的位置,点击"插入">"书签&quo

C#导出文本内容到word文档的方法

本文实例讲述了C#导出文本内容到word文档的方法.分享给大家供大家参考.具体实现方法如下: <%@ Page Language="C#" AutoEventWireup="true" %> <script runat="server"> protected void Page_Load(object sender, EventArgs e) { Repeater1.DataSource = new String[] {

C#实现合并多个word文档的方法

本文实例讲述了C#实现合并多个word文档的方法,是非常具有实用价值的技巧.分享给大家供大家参考. 具体实现方法如下: using System; using System.Collections.Generic; using System.Linq; using System.Web; using Microsoft.Office.Interop.Word; using System.Reflection; using System.IO; using System.Diagnostics;

使用PHPWord生成word文档的方法详解

本文实例讲述了使用PHPWord生成word文档的方法.分享给大家供大家参考,具体如下: 有时我们需要把网页内容保存为Word文档格式,以供其他人员查看和编辑.PHPWord是一个用纯PHP编写的库,使用PHPWord可以轻松处理word文档内容,生成你想要的word文档. 下载源码 安装 我们使用Composer 来安装PHPWord. composer require phpoffice/phpword 如何使用 自动加载 安装好phpword后,新建一个php文档,引入autoload.p

nodejs(officegen)+vue(axios)在客户端导出word文档的方法

前言 我的项目中有一个需求:点击按钮生成可编辑的word文档订单详情的信息 我使用的前端框架是Vue.js.后台使用的是node.js node.js生成和导出word文档我参考的是下面这两篇文章,写的挺好的(github上的那篇里面还有node.js生成word.excel.ppt的example,需要详细的可以看里面) https://www.jb51.net/article/144769.htm https://github.com/Ziv-Barber... 问题 node.js上面这两