65.9K
CodeProject 正在变化。 阅读更多。
Home

演示 OLE 自动化 MS Word

starIconstarIconstarIconemptyStarIconemptyStarIcon

3.00/5 (8投票s)

2002 年 2 月 25 日

1分钟阅读

viewsIcon

147550

downloadIcon

23038

一篇演示自动化的文章,展示了如何根据书签分割 MS-Word 文件。

Sample Image - word.jpg

引言

这是一个 Microsoft Word OLE 自动化的代码示例。该项目接受两个文件夹作为源路径和目标路径。它打开源路径中的每个文档文件,并检查以 'P' 开头的书签。如果找到,它将使用书签内容创建一个新文件。

步骤

  1. 使用 MFC 应用向导创建一个对话框项目,勾选自动化支持复选框。添加 2 个按钮,分别命名为“Ellipsis1”和“Ellipsis2”,并标记为“源...”和“目标...”(这些是浏览按钮)。 另外添加一个“自动化”按钮(这将启动自动化)。

  2. 打开类向导,转到“自动化”选项卡。

  3. 选择“添加类”。

  4. 选择“从类型库中选择”。

  5. 选择文件 MSWORD*.OLD,其中 * 可以是根据机器上安装的 Office 版本而定的任何内容。

  6. 从列表中选择类 _Application、_DocumentDocumentsBookmarksBookmarkRange Selection

  7. 在对话框的编辑框中添加两个变量 m_SourcePath 和 m_DestinationPath 作为 CString

  8. 对于 Ellipsis1 的“单击”事件,添加以下代码。当单击浏览按钮并打开源路径的“浏览”对话框时,将调用此代码。
  9. void CWord1Dlg::OnEllipsis1() 
    {
        BROWSEINFO browseInfo;
        browseInfo.hwndOwner = NULL ;
        browseInfo.pidlRoot = NULL; 
        browseInfo.lpszTitle = "Enter The Source Path";   
        browseInfo.ulFlags = 0 ; 
        browseInfo.lpfn = NULL; 
        browseInfo.lParam = 0;  
    
        LPITEMIDLIST lpItemIDList;
        if ((lpItemIDList = ::SHBrowseForFolder(&browseInfo))!= NULL)
        {
            SHGetPathFromIDList(lpItemIDList,m_SourcePath.GetBuffer(256));
            UpdateData(FALSE);
        }    
    }
    
  10. 对于 Ellipsis2 的单击事件,添加以下代码
    void CWord1Dlg::OnEllipsis2() 
    {
        BROWSEINFO browseInfo;
        browseInfo.hwndOwner = NULL ;
        browseInfo.pidlRoot = NULL; 
        browseInfo.lpszTitle = "Enter The Destination Path";   
        browseInfo.ulFlags = 0 ; 
        browseInfo.lpfn = NULL; 
        browseInfo.lParam = 0;  
    
        LPITEMIDLIST lpItemIDList;
        if ((lpItemIDList = ::SHBrowseForFolder(&browseInfo))!= NULL)
        {
            SHGetPathFromIDList(lpItemIDList,m_DestinationPath.GetBuffer(256));
            UpdateData(FALSE);
        }        
    }
    
    
  11. 将以下代码添加到“自动化”按钮
    void CWord1Dlg::OnAutomate() 
    {
        COleVariant m_True((short)TRUE), m_False((short)FALSE), 
                    m_Long((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
    
        long startPos,endPos,m_LoopVar;
    
        BOOL m_FoundTheFile;
        
        CString m_FileName;
    
        UpdateData(TRUE);
        if(m_SourcePath=="" || m_DestinationPath =="")
        {
            MessageBox("Either Source Or Destination Path is Invalid",
                       "Easy Split Error",MB_ICONINFORMATION);
            return;
        }
    
        _Application appObj;
    
        if(!appObj.CreateDispatch("Word.Application"))
        {
            AfxMessageBox("Coud Not Create The Application Object");
        }
    
        appObj.SetVisible(FALSE);
    
        Documents docsObj(appObj.GetDocuments());
    
        _Document docObj,tempDocObj;
    
        CFileFind m_FileFind;
    
        m_FoundTheFile = m_FileFind.FindFile(m_SourcePath+"\\*.doc");
    
        while(m_FoundTheFile)
        {
            m_FoundTheFile=m_FileFind.FindNextFile();
    
            docObj.AttachDispatch(docsObj.Open(COleVariant(m_FileFind.GetFilePath()),
                                  m_False,m_False,m_False,m_Long,m_Long,m_False,
                                  m_Long,m_Long,m_Long  ));
    
            Bookmarks m_Books(docObj.GetBookmarks());    
    
            Bookmark m_Book;
    
            Selection selObj(appObj.GetSelection());
    
            startPos=0;
            endPos=0;
    
            for(m_LoopVar=1;m_LoopVar<= m_Books.GetCount();m_LoopVar++)
            {
                startPos=endPos ;
        
                docObj.Activate();
            
                m_Book.AttachDispatch(m_Books.Item(COleVariant(m_LoopVar)));
    
                if(m_Book.GetName().GetAt(0)!='P')
    
                    continue;
    
                endPos= m_Book.GetEnd();
    
                selObj.AttachDispatch(appObj.GetSelection());
    
                selObj.SetRange(startPos,endPos);
    
                selObj.Copy();
    
                docsObj.Add(m_Long , m_Long );
    
                selObj.AttachDispatch(appObj.GetSelection());
    
                selObj.Paste();
    
                tempDocObj.AttachDispatch(appObj.GetActiveDocument());
    
                m_FileName.Format("%s%d.doc", m_DestinationPath+"\\"
                                  + m_FileFind.GetFileTitle(), m_LoopVar);
            
                tempDocObj.SaveAs(COleVariant(m_FileName),m_Long,m_False,
                                  COleVariant(""), m_True,COleVariant(""),
                                  m_False,m_False,m_False,m_False,m_False);
    
                selObj.Shrink();
    
                m_Book.DetachDispatch();
            }
        }
    
        tempDocObj.Close(m_Long,m_Long,m_Long);
    
        docObj.Close(m_Long,m_Long,m_Long);
    
        docsObj.Close(m_Long,m_Long,m_Long);
    
        appObj.Quit(m_Long,m_Long,m_Long);
    
        m_FileFind.Close();
    
        MessageBox("Completed Successfully","Easy Split",MB_ICONINFORMATION);
    }
© . All rights reserved.