请问:
    java 中如何实现创建、编辑一个WORD文档呢?
即把文本写入WORD文档,并能够设置其中的字体、换行等等。各位有没有用过或听说的,急等。
   多谢了。

解决方案 »

  1.   

    Java 可以使用JACOB来控制Office控件很方便,你可以去下载一个.下面介绍几个WORD常见的对象以及一些典型的处理过程,希望对大家有帮助。 
         
     
    private ActiveXComponent word = null; /** WORD对象*/
    private Dispatch documents = null; /** 文档对象*/
    private Dispatch vSelection = null; /** selection 对象是比较重要的一个对象 */ 
    private Dispatch wordfile = null; /** 一个WORD文档 */ 1,初始化 
    word = new ActiveXComponent("Word.Application"); 
    documents = word.getProperty("Documents").toDispatch();  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"); 详细看看JACOB的说明
      

  2.   

    dfsgsdfg