`

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文件工具类级dell文件

    在Java操作Word的场景下,我们可以利用Jacob调用Microsoft Word的COM接口,实现对Word文档的各种操作,如读取、写入、修改、保存等。 标题中的“工具类级”意味着我们需要创建一个Java类,这个类将封装Jacob库的...

    java操作word 封装包+jacob +dll

    另一方面,Office_Wrapper是一个更高级的封装库,它基于JACOB或其他COM桥接技术,但提供了一种更简洁、更易于使用的API来操作Word文档。使用Office_Wrapper,你可以更直观地创建、读取、编辑和格式化Word文档,而...

    Java通过word模板配置书签生成word

    "Java通过word模板配置书签生成word"是一个技术方案,它利用了Java的API来处理Microsoft Word文档,特别是Apache POI库,这是一种强大的工具,允许开发者在Java程序中创建、修改和展示MS Office格式的文件。...

    Java导出Word文档的实现.docx

    1. **Hutool的Word工具类**:这是一个简洁易用的Java工具库,其提供的Word工具类可以方便地生成简单的Word文档。然而,它的局限在于无法创建包含复杂表格的文档。 2. **Apache POI和FreeMarker**:Apache POI是Java...

    java2word程序代码及jar包

    `Java2Word.jar`则是主要的Java库,它封装了对Word文档的操作接口和逻辑。通过这个库,开发者可以避免直接处理复杂的COM接口,而是使用Java API来创建和编辑Word文档。它支持添加文本、图片、表格、列表、页眉、页脚...

    JAVA生成WORD工具类

    这个“JAVA生成WORD工具类”提供了一种解决方案,使得开发者可以通过代码动态地生成Word文档,避免手动操作的繁琐和错误。下面将详细介绍这个工具类的工作原理和可能的应用场景。 首先,Java生成Word文档通常涉及到...

    java生成word文件代码

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

    java_word_poi_demo

    Java Word POI Demo是一个关于如何使用Java编程语言和Apache POI库来操作Microsoft Word文档的示例项目。Apache POI是开源项目,专门用于读取、写入和修改Microsoft Office格式的文件,包括Word(.doc和.docx)、...

    java操作word:jacob(方法解析+环境配置)

    为了方便地使用Java操作Word文档,可以使用Jacob官方提供的`MSWordManager`类。这个类封装了大多数Java操作Microsoft Office的功能,使得开发者能够更加简单高效地完成任务。 #### 示例代码 以下是一个简化的Java...

    java常用工具类封装

    POI提供了HWPF(用于老版本的.doc)和XWPF(用于.docx)API,可以创建、修改和显示Word文档内容。 - **PDF解析**:iText或Apache PDFBox是常用的PDF处理库,可以用于读取、创建、修改PDF文档。 - **Excel解析**:...

    java使用word模板导出个人简历

    Apache POI是一个流行的API,用于读写Microsoft Office格式的文件,包括Word文档。首先,你需要加载.dot模板,然后使用Freemarker的API替换模板中的变量,最后保存为.doc文件。 3. **处理Word2007模板(.dotx)**:...

    java代码实现填充word模板生成word合同的实例

    在这个实例中,我们主要会用到它的`XWPFDocument`和`XWPFParagraph`等类来操作Word文档。 以下是实现该功能的基本步骤: 1. **创建或打开Word模板**:使用`XWPFDocument`类创建一个新的Word文档,或者通过`...

    java 题库 word 文档

    这份"java题库word文档"包含了关于Java的综合习题,旨在帮助学习者深入理解和掌握Java的核心概念和技术。以下是对这些习题中可能涵盖的知识点的详细解释: 1. **Java基础知识**:这包括Java的历史、设计原则、JVM...

    jacob实现文档插入到word中

    这个库是用Java语言封装的ActiveX接口,使得开发者能够在Java环境中调用和控制Word的功能,如创建、修改、读取和格式化Word文档。在本文中,我们将深入探讨如何使用Jacob在Word文档中插入其他文档。 首先,理解Java...

    javaword文档导出jar包freemarker.rar

    综上所述,"javaword文档导出jar包freemarker"提供了一种高效、灵活的方法,使Java开发者能够在后端生成动态的Word文档,无需直接操作前端。这个过程涉及到Freemarker模板引擎的使用、Java后端的数据处理、以及可能...

    java 生成word 导入内容 图片

    首先,我们需要引入一个能够处理Word文档的库,Apache POI是Java社区广泛使用的开源库,它可以让我们轻松地创建、修改和读取Microsoft Office格式的文件,包括Word(.doc和.docx)。 1. **Apache POI简介**: ...

    JAVA利用poi完成word转pdf,内容包括两个现成工具类和使用到的所有jar包

    在Java开发中,有时我们需要将Word文档转换为PDF格式,以满足不同的应用场景或者跨平台兼容的需求。Apache POI是一个流行的库,主要用于处理Microsoft Office格式的文件,如Word(.doc/.docx)和Excel(.xls/.xlsx)...

    JAVA WORD中实现电子印章效果 文字浮于印章上面

    Apache POI是一个流行的Java库,它允许开发者创建、修改和显示Microsoft Office格式的文件,包括Word文档。 首先,你需要理解Apache POI的工作原理。Apache POI提供了一组API,可以用来操作Word文档的各个元素,如...

Global site tag (gtag.js) - Google Analytics