java操作word文档(jacob,poi)
项目需要,用户从系统里面下载word文档,该文档进行了填写限制和加密,用户只能在固定位置填写内容。现要求系统验证上传的附件是否从系统上下载下来的。
思路:系统上面的文档都加入一个固定书签,用户上传文档的时候,检验文档里是否包含这个书签。
采用jacob操作word文档
JACOB(java -com bridge)是一个 JAVA到微软的COM接口的桥梁。使用JACOB允许任何JVM访问COM对象,从而使JAVA应用程序能够调用COM对象。
下载地址:http://sourceforge.net/projects/jacob-project/
其中jacob-1.16.1-x64.dll 是用于64位机器上的,jacob-1.16.1-x86.dll用于32位的。
该dll放于 C:\Windows\system32 目录下。jacob.jar放于应用lib底下
测试代码
Java代码  ![收藏代码]()
![]()
- ActiveXComponent    word = null;  
- try {  
- word = new ActiveXComponent("Word.Application");  
- System.out.println("jacob当前版本:"+word.getBuildVersion());  
- }catch(Exception e ){  
- e.printStackTrace();  
- }  
ActiveXComponent    word = null;
try {
        word = new ActiveXComponent("Word.Application");
    System.out.println("jacob当前版本:"+word.getBuildVersion());
}catch(Exception e ){
     e.printStackTrace();
}
下面再贴出网上常见的代码+自己整理的几个方法(模糊查询书签等)
注意插入书签+书签值的方法,要先插入书签值再选中书签值,之后插入书签。这样根据书签名才能取得书签值。否则根据网络上很多方法,都取不到书签值或者取到空。因为书签值可以是一个点也可以是一大段内容。
Java代码  ![收藏代码]()
![]()
- import java.io.File;  
- import java.util.HashMap;  
- import java.util.Map;  
- import com.gdcn.bpaf.common.helper.StringHelper;  
- import com.jacob.activeX.ActiveXComponent;  
- import com.jacob.com.ComThread;  
- import com.jacob.com.Dispatch;  
- import com.jacob.com.Variant;  
- /// 
- /  / 
- /* Description: {jacob操作word类}     
- /* 
- /* Copyright: Copyright (c) 2011 
- /*  
- /* CreateDate: 2012-6-28 
- /* 
- /* @author Beny 
- /* @version 1.0 
- /*/  
- public class JacobHelper {  
- // word文档  
- private Dispatch doc;  
- // word运行程序对象  
- private ActiveXComponent word;  
- // 所有word文档集合  
- private Dispatch documents;  
- // 选定的范围或插入点  
- private Dispatch selection;  
- private boolean saveOnExit = true;  
- public JacobHelper(boolean visible) throws Exception {  
- ComThread.InitSTA();//线程启动  
- if (word == null) {  
- word = new ActiveXComponent("Word.Application");  
- word.setProperty("Visible", new Variant(visible)); // 不可见打开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.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();  
- }  
- /// 
- /* 打开一个加密的文档 
- /* @param docPath 
- /* @param pwd 
- /* @throws Exception 
- /*/  
- 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 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", "false");  
- // 查找并选中  
- 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 boldSize 
- /* @param italicSize 
- /* @param underLineSize 
- /*            下划线 
- /* @param colorSize 
- /*            字体颜色 
- /* @param size 
- /*            字体大小 
- /* @param name 
- /*            字体名称 
- /* @param hidden 
- /*            是否隐藏 
- /*/  
- public void setFont(boolean bold, boolean italic, boolean underLine,  
- String colorSize, String size, String name,boolean hidden) {  
- 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);  
- Dispatch.put(font, "Hidden", hidden);  
- }  
- /// 
- /* 文件保存或另存为 
- /*  
- /* @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));//注 是documents而不是doc  
- documents = null;  
- doc = null;  
- }  
- /// 
- /* 关闭当前word文档 
- /*  
- /*/  
- public void closeDocument() {  
- if (documents != null) {  
- Dispatch.call(documents, "Save");  
- Dispatch.call(documents, "Close", new Variant(saveOnExit));  
- documents = null;  
- doc = null;  
- }  
- }  
- public void closeDocumentWithoutSave() {  
- if (documents != null) {  
- Dispatch.call(documents, "Close", new Variant(false));  
- documents = null;  
- doc = null;  
- }  
- }  
- /// 
- /* 保存并关闭全部应用 
- /*  
- /*/  
- public void close() {  
- closeDocument(-1);  
- if (word != null) {  
- //          Dispatch.call(word, "Quit");  
- word.invoke("Quit", new Variant[] {});  
- word = null;  
- }  
- selection = null;  
- documents = null;  
- ComThread.Release();//释放com线程。根据jacob的帮助文档,com的线程回收不由java的垃圾回收器处理  
- }  
- /// 
- /* 打印当前word文档 
- /*  
- /*/  
- public void printFile() {  
- if (doc != null) {  
- Dispatch.call(doc, "PrintOut");  
- }  
- }  
- /// 
- /* 保护当前档,如果不存在, 使用expression.Protect(Type, NoReset, Password) 
- /*  
- /* @param pwd 
- /* @param type 
- /*            WdProtectionType 常量之一(int 类型,只读): 
- /*            1-wdAllowOnlyComments  仅批注 
- /*            2-wdAllowOnlyFormFields 仅填写窗体 
- /*            0-wdAllowOnlyRevisions 仅修订 
- /*            -1-wdNoProtection 无保护,  
- /*            3-wdAllowOnlyReading 只读 
- /*  
- /*/  
- public void protectedWord(String pwd,String type) {  
- String protectionType = Dispatch.get(doc, "ProtectionType").toString();  
- if (protectionType.equals("-1")) {  
- Dispatch.call(doc, "Protect", Integer.parseInt(type), new Variant(true),pwd);  
- }  
- }  
- /// 
- /* 解除文档保护,如果存在 
- /*  
- /* @param pwd 
- /*            WdProtectionType 常量之一(int 类型,只读): 
- /*            1-wdAllowOnlyComments  仅批注 
- /*            2-wdAllowOnlyFormFields 仅填写窗体 
- /*            0-wdAllowOnlyRevisions 仅修订 
- /*            -1-wdNoProtection 无保护,  
- /*            3-wdAllowOnlyReading 只读 
- /*  
- /*/  
- public void unProtectedWord(String pwd) {  
- String protectionType = Dispatch.get(doc, "ProtectionType").toString();  
- if (!protectionType.equals("0")&&!protectionType.equals("-1")) {  
- Dispatch.call(doc, "Unprotect", pwd);  
- }  
- }  
- /// 
- /* 返回文档的保护类型 
- /* @return 
- /*/  
- public String getProtectedType(){  
- return Dispatch.get(doc, "ProtectionType").toString();  
- }  
- /// 
- /* 设置word文档安全级别 
- /*  
- /* @param value 
- /*            1-msoAutomationSecurityByUI 使用“安全”对话框指定的安全设置。 
- /*            2-msoAutomationSecurityForceDisable 
- /*            在程序打开的所有文件中禁用所有宏,而不显示任何安全提醒。 3-msoAutomationSecurityLow 
- /*            启用所有宏,这是启动应用程序时的默认值。 
- /*/  
- public void setAutomationSecurity(int value) {  
- word.setProperty("AutomationSecurity", new Variant(value));  
- }  
- /// 
- /* 在word中插入标签 labelName是标签名,labelValue是标签值 
- /* @param labelName 
- /* @param labelValue 
- /*/  
- public  void insertLabelValue(String labelName,String labelValue) {  
- Dispatch bookMarks = Dispatch.call(doc, "Bookmarks").toDispatch();  
- boolean isExist = Dispatch.call(bookMarks, "Exists", labelName).getBoolean();  
- if (isExist == true) {  
- Dispatch rangeItem1 = Dispatch.call(bookMarks, "Item", labelName).toDispatch();  
- Dispatch range1 = Dispatch.call(rangeItem1, "Range").toDispatch();  
- String bookMark1Value = Dispatch.get(range1, "Text").toString();  
- System.out.println("书签内容:"+bookMark1Value);  
- } else {  
- System.out.println("当前书签不存在,重新建立!");  
- //TODO 先插入文字,再查找选中文字,再插入标签  
- this.insertText(labelValue);  
- //          this.find(labelValue);//查找文字,并选中  
- this.setFont(true, true,true,"102,92,38", "20", "",true);  
- Dispatch.call(bookMarks, "Add", labelName, selection);  
- Dispatch.call(bookMarks, "Hidden", labelName);  
- }  
- }  
- /// 
- /* 在word中插入标签 labelName是标签名 
- /* @param labelName 
- /*/  
- public  void insertLabel(String labelName) {  
- Dispatch bookMarks = Dispatch.call(doc, "Bookmarks").toDispatch();  
- boolean isExist = Dispatch.call(bookMarks, "Exists", labelName).getBoolean();  
- if (isExist == true) {  
- System.out.println("书签已存在");  
- } else {  
- System.out.println("建立书签:"+labelName);  
- Dispatch.call(bookMarks, "Add", labelName, selection);  
- }  
- }     
- /// 
- /* 查找书签 
- /* @param labelName 
- /* @return 
- /*/  
- public boolean findLabel(String labelName) {  
- Dispatch bookMarks = Dispatch.call(doc, "Bookmarks").toDispatch();  
- boolean isExist = Dispatch.call(bookMarks, "Exists", labelName).getBoolean();  
- if (isExist == true) {  
- return true;  
- } else {  
- System.out.println("当前书签不存在!");  
- return false;  
- }  
- }  
- /// 
- /* 模糊查找书签,并返回准确的书签名称 
- /* @param labelName 
- /* @return 
- /*/  
- public String findLabelLike(String labelName) {  
- Dispatch bookMarks = Dispatch.call(doc, "Bookmarks").toDispatch();  
- int count = Dispatch.get(bookMarks, "Count").getInt(); // 书签数  
- Dispatch rangeItem = null;  
- String lname = "";  
- for(int i=1;i<=count;i++){  
- rangeItem = Dispatch.call(bookMarks, "Item", new Variant(i)).toDispatch();  
- lname = Dispatch.call(rangeItem, "Name").toString();//书签名称  
- if(lname.startsWith(labelName)){//前面匹配  
- //             return lname.replaceFirst(labelName, "");//返回后面值  
- return lname;  
- }  
- }  
- return "";  
- }  
- /// 
- /* 模糊删除书签 
- /* @param labelName 
- /*/  
- public void deleteLableLike(String labelName){  
- Dispatch bookMarks = Dispatch.call(doc, "Bookmarks").toDispatch();  
- int count = Dispatch.get(bookMarks, "Count").getInt(); // 书签数  
- Dispatch rangeItem = null;  
- String lname = "";  
- for(int i=1;i<=count;i++){  
- rangeItem = Dispatch.call(bookMarks, "Item", new Variant(i)).toDispatch();  
- lname = Dispatch.call(rangeItem, "Name").toString();//书签名称  
- if(lname.startsWith(labelName)){//前面匹配  
- Dispatch.call(rangeItem, "Delete");  
- count--;//书签已被删除,书签数目和当前书签都要相应减1,否则会报错:集合找不到  
- i--;  
- }  
- }  
- }  
- /// 
- /* 获取书签内容 
- /* @param labelName 
- /* @return 
- /*/  
- public String getLableValue(String labelName){  
- if(this.findLabel(labelName)){  
- Dispatch bookMarks = Dispatch.call(doc, "Bookmarks").toDispatch();  
- Dispatch rangeItem1 = Dispatch.call(bookMarks, "Item", labelName).toDispatch();  
- Dispatch range1 = Dispatch.call(rangeItem1, "Range").toDispatch();  
- Dispatch font = Dispatch.get(range1, "Font").toDispatch();  
- Dispatch.put(font, "Hidden", new Variant(false)); //显示书签内容  
- String bookMark1Value = Dispatch.get(range1, "Text").toString();  
- System.out.println("书签内容:"+bookMark1Value);  
- //            font = Dispatch.get(range1, "Font").toDispatch();  
- //              Dispatch.put(font, "Hidden", new Variant(true)); //隐藏书签内容  
- return bookMark1Value;  
- }  
- return "";  
- }  
- public static void main(String[] args) throws Exception {  
- }     
- }  
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import com.gdcn.bpaf.common.helper.StringHelper;
import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.ComThread;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;
///
 /  /
 / Description: {jacob操作word类}    
/
/ Copyright: Copyright (c) 2011
/
/ CreateDate: 2012-6-28
/
/ @author Beny
/ @version 1.0
/*/
public class JacobHelper {
    // word文档
private Dispatch doc;
// word运行程序对象
private ActiveXComponent word;
// 所有word文档集合
private Dispatch documents;
// 选定的范围或插入点
private Dispatch selection;
private boolean saveOnExit = true;
public JacobHelper(boolean visible) throws Exception {
    ComThread.InitSTA();//线程启动
    if (word == null) {
        word = new ActiveXComponent("Word.Application");
        word.setProperty("Visible", new Variant(visible)); // 不可见打开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.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();
}
//*/*
 /* 打开一个加密的文档
 /* @param docPath
 /* @param pwd
 /* @throws Exception
 /*/
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 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", "false");
    // 查找并选中
    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 boldSize
 /* @param italicSize
 /* @param underLineSize
 /*            下划线
 /* @param colorSize
 /*            字体颜色
 /* @param size
 /*            字体大小
 /* @param name
 /*            字体名称
 /* @param hidden
 /*            是否隐藏
 /*/
public void setFont(boolean bold, boolean italic, boolean underLine,
        String colorSize, String size, String name,boolean hidden) {
    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);
    Dispatch.put(font, "Hidden", hidden);
}
//*/*
 /* 文件保存或另存为
 /*
 /* @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));//注 是documents而不是doc
    documents = null;
    doc = null;
}
//*/*
 /* 关闭当前word文档
 /*
 /*/
public void closeDocument() {
    if (documents != null) {
        Dispatch.call(documents, "Save");
        Dispatch.call(documents, "Close", new Variant(saveOnExit));
        documents = null;
        doc = null;
    }
}
public void closeDocumentWithoutSave() {
    if (documents != null) {
        Dispatch.call(documents, "Close", new Variant(false));
        documents = null;
        doc = null;
    }
}
//*/*
 /* 保存并关闭全部应用
 /*
 /*/
public void close() {
    closeDocument(-1);
    if (word != null) {
//            Dispatch.call(word, "Quit");
            word.invoke("Quit", new Variant[] {});
        word = null;
    }
    selection = null;
    documents = null;
    ComThread.Release();//释放com线程。根据jacob的帮助文档,com的线程回收不由java的垃圾回收器处理
}
//*/*
 /* 打印当前word文档
 /*
 /*/
public void printFile() {
    if (doc != null) {
        Dispatch.call(doc, "PrintOut");
    }
}
//*/*
 /* 保护当前档,如果不存在, 使用expression.Protect(Type, NoReset, Password)
 /*
 /* @param pwd
 /* @param type
 /*            WdProtectionType 常量之一(int 类型,只读):
 /*            1-wdAllowOnlyComments  仅批注
 /*            2-wdAllowOnlyFormFields 仅填写窗体
 /*            0-wdAllowOnlyRevisions 仅修订
 /*            -1-wdNoProtection 无保护,
 /*            3-wdAllowOnlyReading 只读
 /*
 /*/
public void protectedWord(String pwd,String type) {
    String protectionType = Dispatch.get(doc, "ProtectionType").toString();
    if (protectionType.equals("-1")) {
        Dispatch.call(doc, "Protect", Integer.parseInt(type), new Variant(true),pwd);
    }
}
//*/*
 /* 解除文档保护,如果存在
 /*
 /* @param pwd
 /*            WdProtectionType 常量之一(int 类型,只读):
 /*            1-wdAllowOnlyComments  仅批注
 /*            2-wdAllowOnlyFormFields 仅填写窗体
 /*            0-wdAllowOnlyRevisions 仅修订
 /*            -1-wdNoProtection 无保护,
 /*            3-wdAllowOnlyReading 只读
 /*
 /*/
public void unProtectedWord(String pwd) {
    String protectionType = Dispatch.get(doc, "ProtectionType").toString();
    if (!protectionType.equals("0")&&!protectionType.equals("-1")) {
        Dispatch.call(doc, "Unprotect", pwd);
    }
}
//*/*
 /* 返回文档的保护类型
 /* @return
 /*/
public String getProtectedType(){
    return Dispatch.get(doc, "ProtectionType").toString();
}
//*/*
 /* 设置word文档安全级别
 /*
 /* @param value
 /*            1-msoAutomationSecurityByUI 使用“安全”对话框指定的安全设置。
 /*            2-msoAutomationSecurityForceDisable
 /*            在程序打开的所有文件中禁用所有宏,而不显示任何安全提醒。 3-msoAutomationSecurityLow
 /*            启用所有宏,这是启动应用程序时的默认值。
 /*/
public void setAutomationSecurity(int value) {
    word.setProperty("AutomationSecurity", new Variant(value));
}
//*/*
 /* 在word中插入标签 labelName是标签名,labelValue是标签值
 /* @param labelName
 /* @param labelValue
 /*/
public  void insertLabelValue(String labelName,String labelValue) {
   Dispatch bookMarks = Dispatch.call(doc, "Bookmarks").toDispatch();
   boolean isExist = Dispatch.call(bookMarks, "Exists", labelName).getBoolean();
    if (isExist == true) {
        Dispatch rangeItem1 = Dispatch.call(bookMarks, "Item", labelName).toDispatch();
        Dispatch range1 = Dispatch.call(rangeItem1, "Range").toDispatch();
        String bookMark1Value = Dispatch.get(range1, "Text").toString();
          System.out.println("书签内容:"+bookMark1Value);
    } else {
        System.out.println("当前书签不存在,重新建立!");
        //TODO 先插入文字,再查找选中文字,再插入标签
        this.insertText(labelValue);
//            this.find(labelValue);//查找文字,并选中
        this.setFont(true, true,true,"102,92,38", "20", "",true);
         Dispatch.call(bookMarks, "Add", labelName, selection);
         Dispatch.call(bookMarks, "Hidden", labelName);
    }
}
//*/*
 /* 在word中插入标签 labelName是标签名
 /* @param labelName
 /*/
public  void insertLabel(String labelName) {
   Dispatch bookMarks = Dispatch.call(doc, "Bookmarks").toDispatch();
   boolean isExist = Dispatch.call(bookMarks, "Exists", labelName).getBoolean();
    if (isExist == true) {
          System.out.println("书签已存在");
    } else {
        System.out.println("建立书签:"+labelName);
         Dispatch.call(bookMarks, "Add", labelName, selection);
    }
}   
//*/*
 /* 查找书签
 /* @param labelName
 /* @return
 /*/
public boolean findLabel(String labelName) {
   Dispatch bookMarks = Dispatch.call(doc, "Bookmarks").toDispatch();
   boolean isExist = Dispatch.call(bookMarks, "Exists", labelName).getBoolean();
   if (isExist == true) {
          return true;
    } else {
        System.out.println("当前书签不存在!");
        return false;
    }
}
//*/*
 /* 模糊查找书签,并返回准确的书签名称
 /* @param labelName
 /* @return
 /*/
public String findLabelLike(String labelName) {
   Dispatch bookMarks = Dispatch.call(doc, "Bookmarks").toDispatch();
   int count = Dispatch.get(bookMarks, "Count").getInt(); // 书签数
   Dispatch rangeItem = null;
   String lname = "";
   for(int i=1;i<=count;i++){
       rangeItem = Dispatch.call(bookMarks, "Item", new Variant(i)).toDispatch();
       lname = Dispatch.call(rangeItem, "Name").toString();//书签名称
       if(lname.startsWith(labelName)){//前面匹配
//               return lname.replaceFirst(labelName, "");//返回后面值
           return lname;
       }
   }
   return "";
}
//*/*
 /* 模糊删除书签
 /* @param labelName
 /*/
public void deleteLableLike(String labelName){
    Dispatch bookMarks = Dispatch.call(doc, "Bookmarks").toDispatch();
   int count = Dispatch.get(bookMarks, "Count").getInt(); // 书签数
   Dispatch rangeItem = null;
   String lname = "";
   for(int i=1;i<=count;i++){
       rangeItem = Dispatch.call(bookMarks, "Item", new Variant(i)).toDispatch();
       lname = Dispatch.call(rangeItem, "Name").toString();//书签名称
       if(lname.startsWith(labelName)){//前面匹配
           Dispatch.call(rangeItem, "Delete");
           count--;//书签已被删除,书签数目和当前书签都要相应减1,否则会报错:集合找不到
           i--;
       }
   }
}
//*/*
 /* 获取书签内容
 /* @param labelName
 /* @return
 /*/
public String getLableValue(String labelName){
    if(this.findLabel(labelName)){
        Dispatch bookMarks = Dispatch.call(doc, "Bookmarks").toDispatch();
        Dispatch rangeItem1 = Dispatch.call(bookMarks, "Item", labelName).toDispatch();
        Dispatch range1 = Dispatch.call(rangeItem1, "Range").toDispatch();
        Dispatch font = Dispatch.get(range1, "Font").toDispatch();
        Dispatch.put(font, "Hidden", new Variant(false)); //显示书签内容
        String bookMark1Value = Dispatch.get(range1, "Text").toString();
          System.out.println("书签内容:"+bookMark1Value);
//            font = Dispatch.get(range1, "Font").toDispatch();
//              Dispatch.put(font, "Hidden", new Variant(true)); //隐藏书签内容
          return bookMark1Value;
    }
    return "";
}
public static void main(String[] args) throws Exception {
}   
}
 采用jacob方式操作文档,经常会出现卡机的现象,所以最后采用poi方式来操作书签。若单纯的操作书签用poi方式还是比较简单的,但要操作表格、文档格式之类的还是用jacob功能比较强大。
Java代码  ![收藏代码]()
![]()
- InputStream input = null;  
- File docFile = new File( fileName );  
- HWPFDocument document = null;  
- try{  
- input = new FileInputStream(docFile);//加载 doc 文档  
- document = new HWPFDocument(input);//文件流方式创建hwpf  
- Bookmarks bookmarks =  document.getBookmarks();//文档书签  
- for(int i=0,length=bookmarks.getBookmarksCount();i<length;i++){  
- bookmarkName = bookmarks.getBookmark(i).getName();  
- //.....  
- }  
- }catch( Exception e){  
- }finally{  
- if( null != input )  
- input.close();  
- }  
InputStream input = null;
File docFile = new File( fileName );
HWPFDocument document = null;
try{
    input = new FileInputStream(docFile);//加载 doc 文档
document = new HWPFDocument(input);//文件流方式创建hwpf
Bookmarks bookmarks =  document.getBookmarks();//文档书签
for(int i=0,length=bookmarks.getBookmarksCount();i<length;i++){
    bookmarkName = bookmarks.getBookmark(i).getName();
    //.....
}
}catch( Exception e){
}finally{
if( null != input )
        input.close();
}