`

Java操作Word文档封装类

    博客分类:
  • Java
阅读更多

基于开源项目jacob的基础上,封装了操作Word常用的方法和接口。jacob项目是通过java操作com接口的工具,这部分代码是封装了操作word的常用com接口。需要配合jacob.dll和jacob.jar使用。

 

import java.io.File;
 
import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.ComFailException;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;
 
final class WordBean {
    /**
     * 读取Com接口异常的最多重试次数.
     */
    private static final int MAX_RETRY = 10;
    /**
     * word文档.
     */
    private Dispatch doc;
    /**
     * word运行程序对象.
     */
    private ActiveXComponent wordApp = null;
    /**
     * 选定的范围或插入点.
     */
    private Dispatch selection;
    /**
     * 退出时是否保存文档.
     */
    private boolean saveOnExit = true;
 
    /**
     * 构造函数.
     * @param show 是否可见.
     */
    public WordBean(final boolean show) {
        if (wordApp == null) {
            wordApp = new ActiveXComponent("Word.Application");
            wordApp.setProperty("Visible", new Variant(show));
        }
    }
 
    /**
     * 设置退出时参数.
     * @param b boolean true-退出时保存文件,false-退出时不保存文件
     */
    public void setSaveOnExit(
            final boolean b) {
        this.saveOnExit = b;
    }
 
    /**
     * 把选定的内容或插入点向上移动.
     * @param pos 移动的距离
     */
    public void moveUp(
            final int pos) {
 
        if (selection == null) {
            selection = Dispatch.get(wordApp, "Selection").toDispatch();
        }
 
        for (int i = 0; i < pos; i++) {
            Dispatch.call(selection, "MoveUp");
        }
    }
 
    /**
     * 把选定的内容或者插入点向下移动.
     * @param pos 移动的距离
     */
    public void moveDown(
            final int pos) {
 
        if (selection == null) {
            selection = Dispatch.get(wordApp, "Selection").toDispatch();
        }
 
        for (int i = 0; i < pos; i++) {
            Dispatch.call(selection, "MoveDown");
        }
    }
 
    /**
     * 把选定的内容或者插入点向左移动.
     * @param pos 移动的距离
     */
    public void moveLeft(
            final int pos) {
 
        if (selection == null) {
            selection = Dispatch.get(wordApp, "Selection").toDispatch();
        }
 
        for (int i = 0; i < pos; i++) {
            Dispatch.call(selection, "MoveLeft");
        }
    }
 
    /**
     * 把选定的内容或者插入点向右移动.
     * @param pos 移动的距离
     */
    public void moveRight(
            final int pos) {
 
        if (selection == null) {
            selection = Dispatch.get(wordApp, "Selection").toDispatch();
        }
 
        for (int i = 0; i < pos; i++) {
            Dispatch.call(selection, "MoveRight");
        }
    }
 
    /**
     * 把插入点移动到文件首位置.
     */
    public void moveStart() {
        if (selection == null) {
            selection = Dispatch.get(wordApp, "Selection").toDispatch();
        }
 
        Dispatch.call(selection, "HomeKey", new Variant(6));
    }
 
    /**
     * 把插入点移动到文件尾位置.
     */
    public void moveEnd() {
        if (selection == null) {
            selection = Dispatch.get(wordApp, "Selection").toDispatch();
        }
 
        Dispatch.call(selection, "EndKey", new Variant(6));
    }
 
    /**
     * 增加缩进.
     * @param pos 缩进量
     */
    public void listIndent(
            final int pos) {
 
        Dispatch range = Dispatch.get(this.selection, "Range").toDispatch();
        Dispatch listFormat = Dispatch.get(range, "ListFormat").toDispatch();
        for (int i = 0; i < pos; i++) {
            Dispatch.call(listFormat, "ListIndent");
        }
    }
 
    /**
     * 减少缩进.
     * @param pos 缩进量
     */
    public void listOutdent(
            final int pos) {
 
        Dispatch range = Dispatch.get(this.selection, "Range").toDispatch();
        Dispatch listFormat = Dispatch.get(range, "ListFormat").toDispatch();
        for (int i = 0; i < pos; i++) {
            Dispatch.call(listFormat, "ListOutdent");
        }
    }
 
    /**
     * 回车换行.
     */
    public void enter() {
        int index = 1;
        while (true) {
            try {
                Dispatch.call(this.selection, "TypeParagraph");
                break;
            } catch (ComFailException e) {
                if (index++ >= MAX_RETRY) {
                    throw e;
                } else {
                    continue;
                }
            }
        }
    }
 
    /**
     * 插入一个换页符.
     */
    public void insertPageBreak() {
        Dispatch.call(this.selection, "InsertBreak", new Variant(2));
    }
 
    /**
     * 设置word文档是否可见.
     * @param isVisible 是否可见
     */
    public void setIsVisible(
            final boolean isVisible) {
 
        wordApp.setProperty("Visible", new Variant(isVisible));
    }
 
    /**
     * 判断文档是否存在.
     * @param docName 文档名称.
     * @return boolean 是否存在.
     */
    private boolean isExist(
            final String docName) {
 
        boolean result = false;
        File file = new File(docName);
        result = file.exists();
        file = null;
        return result;
    }
 
    /**
     * 获取文件名称.
     * @param docName 文档路径.
     * @return 文件名称
     */
    public String getFileName(
            final String docName) {
 
        int pos = docName.lastIndexOf("\\");
        return docName.substring(pos + 1);
    }
 
    /**
     * 打开文档.
     * @param docName 文档路径.
     * @throws WordException 异常
     */
    public void openDocument(
            final String docName)
    throws WordException {
 
        Dispatch docs = wordApp.getProperty("Documents").toDispatch();
 
        if (isExist(docName)) {
            this.closeDocument();
            doc = Dispatch.call(docs, "Open", docName).toDispatch();
        } else {
            wordApp.invoke("Quit", new Variant[] {});
            new WordException("[Open doc failed]: file["
                    + docName + "] isn't existed!");
        }
 
        selection = Dispatch.get(wordApp, "Selection").toDispatch();
    }
 
    /**
     * 添加一个新文档.
     * @param docName 文档路径.
     * @throws WordException 异常
     */
    public void newDocument(
            final String docName)
    throws WordException {
 
        try {
            Dispatch docs = wordApp.getProperty("Documents").toDispatch();
            doc = Dispatch.call(docs, "Add").toDispatch();
            selection = Dispatch.get(wordApp, "Selection").toDispatch();
        } catch (com.jacob.com.ComFailException cfe) {
            throw new WordException(cfe.getMessage());
        } catch (com.jacob.com.ComException ce) {
            throw new WordException(ce.getMessage());
        }
    }
 
    /**
     * 插入一段文字.
     * @param textToInsert 文字
     * @param style 样式
     */
    public void insertText(
            final String textToInsert,
            final String style) {
 
        Dispatch.put(selection, "Text", textToInsert);
        Dispatch.put(selection, "Style", getOutlineStyle(style));
        Dispatch.call(selection, "MoveRight");
    }
 
    /**
     * 插入一个图片.
     * @param imagePath 图片路径.
     * @param style 图片样式
     */
    public void insertImage(
            final String imagePath,
            final String style) {
 
        Dispatch.call(Dispatch.get(selection, "InLineShapes")
                .toDispatch(), "AddPicture", imagePath);
 
        Dispatch.call(selection, "MoveRight");
        Dispatch.put(selection, "Style", getOutlineStyle(style));
        this.enter();
    }
 
    /**
     * 获取对应名称的Style对象.
     * @param style Style名称.
     * @return Style对象
     */
    public Variant getOutlineStyle(
            final String style) {
 
        int index = 1;
        while (true) {
            try {
                return Dispatch.call(
                        Dispatch.get(this.doc, "Styles").toDispatch(),
                        "Item", new Variant(style));
            } catch (ComFailException e) {
                if (index++ >= MAX_RETRY) {
                    throw e;
                } else {
                    continue;
                }
            }
        }
    }
 
    /**
     * 插入标题.
     * @param text 标题文字.
     * @param style 设置标题的类型
     */
    public void insertOutline(
            final String text,
            final String style) {
 
        this.insertText(text, style);
        this.enter();
    }
 
    /**
     * 插入目录.
     * tablesOfContents的参数的含义 Add(Range As Range, [UseHeadingStyles],
     * [UpperHeadingLevel], [LowerHeadingLevel], [UseFields], [TableID],
     * --这两个要不要都可以 [RightAlignPageNumbers],[IncludePageNumbers], [AddedStyles],
     * --这个参数必须有值,必须是数字,如果是其它,则报com.jacob.com.ComFailException
     * [UseHyperlinks],[HidePageNumbersInWeb], [UseOutlineLevels])
     */
    public void insertTablesOfContents() {
        Dispatch tablesOfContents = Dispatch.get(this.doc, "TablesOfContents")
                .toDispatch();
 
        Dispatch range = Dispatch.get(this.selection, "Range").toDispatch();
        // Dispatch.call中的参数最多是9个,如果超过9个,请用Dispatch.callN或者Dispathc.invoke
        /*
         * Dispatch.invoke(tablesOfContents, "Add", Dispatch.Method,new
         * Object[]{range,new Variant(true),new Variant(1), new Variant(3),new
         * Variant(true), new Variant(true),new Variant(true) ,new
         * Variant("1"),new Variant(true),new Variant(true)},new int[10]);
         */
        Dispatch.callN(tablesOfContents, "Add", new Object[] {
                range,
                new Variant(true),
                new Variant(1),
                new Variant(3),
                new Variant(false),
                new Variant(true),
                new Variant(true),
                new Variant("1"),
                new Variant(true),
                new Variant(true)});
    }
 
    /**
     * 从选定内容或插入点开始查找文本.
     * @param toFindText 要查找的文本
     * @return boolean true-查找到并选中该文本,false-未查找到文本
     */
    public boolean find(
            final String toFindText) {
 
        if (toFindText == null
                || toFindText.equals("")) {
            return false;
        }
 
        // 从selection所在位置开始查询
        Dispatch find = Dispatch.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 boolean true-查找到并选中该文本,false-未查找到文本
    */
    public boolean replaceText(
            final String toFindText,
            final String newText) {
 
        if (!find(toFindText)) {
            return false;
        }
 
        Dispatch.put(selection, "Text", newText);
        return true;
    }
 
    /**
     * 创建表格.
     * @param numCols 列数
     * @param numRows 行数
     * @param autoFormat 默认格式
     * @return 表格对象
     */
    public Dispatch createTable(
            final int numRows,
            final int numCols,
            final int autoFormat) {
 
        int index = 1;
        while (true) {
            try {
                Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
                Dispatch range = Dispatch.get(selection, "Range").toDispatch();
                Dispatch newTable = Dispatch.call(tables, "Add", range,
                        new Variant(numRows),
                        new Variant(numCols)).toDispatch();
 
                Dispatch.call(selection, "MoveRight");
                Dispatch.call(newTable, "AutoFormat", new Variant(autoFormat));
                return newTable;
            } catch (ComFailException e) {
                if (index++ >= MAX_RETRY) {
                    throw e;
                } else {
                    continue;
                }
            }
        }
    }
 
    /**
     * 在指定的表头里填写数据.
     * @param table 表格
     * @param cellColIdx 列号
     * @param txt 文字
     * @param style 样式
     */
    public void putTableHeader(
            final Dispatch table,
            final int cellColIdx,
            final String txt,
            final String style) {
 
        Dispatch cell = Dispatch.call(table, "Cell", new Variant(1),
                new Variant(cellColIdx)).toDispatch();
 
        Dispatch.call(cell, "Select");
        Dispatch.put(selection, "Text", txt);
        Dispatch.put(this.selection, "Style", getOutlineStyle(style));
    }
 
    /**
     * 在指定的单元格里填写数据.
     * @param table 表格
     * @param cellRowIdx 行号
     * @param cellColIdx 列号
     * @param txt 文字
     * @param style 样式
     */
    public void putTableCell(
            final Dispatch table,
            final int cellRowIdx,
            final int cellColIdx,
            final String txt,
            final String style) {
 
        Dispatch cell = Dispatch.call(table, "Cell", new Variant(cellRowIdx),
                new Variant(cellColIdx)).toDispatch();
 
        Dispatch.call(cell, "Select");
        Dispatch.put(selection, "Text", txt);
        Dispatch.put(this.selection, "Style", getOutlineStyle(style));
    }
 
    /**
     * 关闭当前word文档.
     */
    private void closeDocument() {
        if (doc != null) {
            Dispatch.call(doc, "Save");
            Dispatch.call(doc, "Close", new Variant(saveOnExit));
            doc = null;
        }
    }
 
    /**
     * 文件保存或另存为.
     * @param savePath 保存或另存为路径
     */
    public void saveFileAs(
            final String savePath) {
 
        Dispatch.call(doc, "SaveAs", savePath);
    }
 
    /**
     * 关闭文档.
     */
    public void close() {
        closeDocument();
        if (wordApp != null) {
            Dispatch.call(wordApp, "Quit");
            wordApp = null;
        }
        selection = null;
    }
}

分享到:
评论
4 楼 wujiazhao88 2010-03-28  
说到底还是要依赖于word。。。。
3 楼 hejianhuacn 2010-03-27  
OpenOffice 里面代码可以借鉴
2 楼 lyndon.lin 2010-03-26  
看具体情况选择吧,因为我一直都是在微软系统上开发。
1 楼 gaoyuntao2005 2010-03-26  
这种操作方法在linux 下不行。不支持dll.还有必须在服务器上安装word ,这样觉得不好。可以试试POI

相关推荐

    java生成word文件代码

    java中生成word文件,生成固定文件模板的word文件 封装成工具类,可以更方便的实现需求

    java常用工具类封装

    java常用工具类封装,线程池、elasticsearch高级客户端集成、word,pdf,excel等文档解析

    Java导出word,excel,pdf工具类.md

    封装好的工具类,传入list ,type(0 excel,1 word ,2 pdf) 导出相应的文件

    java 微信公众号支付、用户授权、推送通知 封装工具类以及公众号后台配置文档

    java 微信公众号支付封装类,传入回调接口、用户openid、订单号、ip、fee即可无脑验签,返回数据直接前端调用。 用户授权获取用户信息,重定向方案设定。 推送通知 封装工具类,传入openid或者 List,可单推和群发。...

    JAVA上百实例源码以及开源项目

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...

    基于Java的坦克大战游戏的设计与实现设计软件程序源码+word毕业论文文档.zip

    基于Java的坦克大战设计与实现设计软件程序源码+word毕业论文文档. 此系统是使用Java语言实现坦克大战游戏程序,玩家通过连接访问进入游戏,通过操纵坦克来守卫基地,玩家还可以获得超级武器来提升坦克的属性,摧毁...

    JAVA上百实例源码以及开源项目源代码

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...

    word工具类

    Word文档java架包+word工具类(工具类里面都已经封装好了一些方法,打开解压之后里面有个项目word_demo直接运行main文件夹下的Java类就可以得当一个带表格word文档(在你的E盘下),另外自己可以随意增减word文档上的...

    基于JAVA CS远程监控系统软件的实现(源代码+WORD论文文档论文).zip

    基于JAVA CS远程监控系统软件的实现(源代码+WORD论文文档论文) 基于JAVA C/S远程监控系统软件的实现 摘 要 近年来,网络技术的不断发展,为远程监控技术的发展创造了条件。远程监控系统软件越来越受到人们的重视,...

    基于JAVA超级玛丽游戏GUL 设计软件源码+WORD毕业论文文档.zip

    超级玛丽游戏GUL 设计软件源码+WORD毕业论文文档。 超级玛丽小游戏的JAVA程序,进入游戏后首先按空格键开始,利用方向键来控制的马里奥的移动,同时检测马里奥与场景中的障碍物和敌人的碰撞,并判断马里奥的可移动...

    java开源包11

    Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...

    java开源包6

    Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...

    记录一下 Java 代码实现文件夹、文件的对比,主要包含 word、pdf、文本、图片等相关文件的对比计算,以及计算文本的相似率(重复率)、筛选出差异的文件、方便文件和文档的去重,并封装为jar包

    记录一下 Java 代码实现文件夹、文件的对比,主要包含 word、pdf、文本、图片等相关文件的对比计算,以及计算文本的相似率(重复率)、筛选出差异的文件、方便文件和文档的去重,并把所有的源码封装为jar包,简单...

    java开源包9

    Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...

    java开源包4

    Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...

    java开源包101

    Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...

    java开源包5

    Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...

    java开源包8

    Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...

    java开源包10

    Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...

    java开源包3

    Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...

Global site tag (gtag.js) - Google Analytics