您的位置:首页 > 移动开发

使用VC创建Office 应用程序自动化项目

2010-07-18 11:30 411 查看
 

原文地址http://blog.sina.com.cn/s/blog_557d25460100guyb.html

   下面先说明如何在VC6.0中创建 MFC 项目。该示例使 Microsoft Excel 自动运行。您可以将前 4 个步骤用于任何项目,在使用其他应用程序时可修改其余步骤。

创建自动化项目

在 VC6.0中,启动一个名为“AutoProject”的新“MFC AppWizard (exe)”项目。

在 MFC AppWizard 的步骤 1 中,为应用程序类型选择“基于对话框”,单击“确定”创建项目。

打开“IDD_AUTOPROJECT_DIALOG”对话框,删除“标签”控件 (IDC_STATIC) 和“取消”按钮 (IDCANCEL)。将“确定”按钮的名称更改为“IDRUN”,并将标题更改为“运行”。关闭对话框设计窗体。

单击“查看”菜单上的“ClassWizard”(或按 Ctrl+W)。 选择“消息映射”选项卡。在“对象 ID”列表框中选择“IDRUN”,在“消息”列表框中选择“BN_CLICKED”。单击“添加函数”并接受函数名称“OnRun”。单击“确定”关闭 ClassWizard。

单击“查看”菜单上的“ClassWizard”(或按 Ctrl+W)。选择“自动”选项卡。单击“添加类”,并选择“从类型库”。在目录中浏览,为要自动运行的应用程序选择对象库(选择“自动”选项卡。单击“添加类”,并选择“从类型库”。在目录中浏览,为要自动运行的应用程序选择对象库(在本例中,Office 2003 中的 Excel.exe 文件的默认位置为 C:/Program Files/Microsoft Office/Office11/Excel.exe。)在选择了相应的对象库后,请单击“打开”。在“确认类”列表中选择所有类,然后单击“确定”,关闭“MFC ClassWizard”对话框。
   “确认类”对话框中的列表框包含 Microsoft Excel 类型库中的所有 IDispatch 接口(它们与类几乎完全一样)。在该对话框的下半部分,您将看到一个名为 Excel.cpp 的实现文件,它包含由ColeDispatchDriver() 派生的已生成的类包装,而相应的声明头文件名为 Excel.h.
以下列表包含 Microsoft Office 2003 应用程序类型库的文件名:
Microsoft Office Access 2003          Msacc.olb
Microsoft Office Excel 2003           Excel.exe
Microsoft Graph 2003                  Graph.exe
Microsoft Office 2003                 MSO.dll
Microsoft Office Outlook 2003         MSOutl.olb
Microsoft Office PowerPoint 2003      MSPpt.olb
Microsoft Office Word 2003            MSWord.olb
 

将以下代码添加到 CAutoProjectApp::InitInstance() 函数中,该函数加载并启用 COM 服务库:     

    
BOOL CAutoProjectApp::InitInstance()
{
if(!AfxOleInit())  // Your addition starts here
{
AfxMessageBox("Could not initialize COM dll");
return FALSE;
}                 // End of your addition

AfxEnableControlContainer();
.
.
.

}

7.将#include <afxdisp.h>添加到 AutoProject.cpp 程序文件开头;将  #include "excel.h"
 添加到 AutoProjectDlg.cpp 程序文件开头.
8.将自动化代码添加到 CAutoProjectDlg::OnRun() 中:
      void CAutoProjectDlg::OnRun()
      {
          _Application app;  // app is the Excel _Application object

          // Start Excel and get Application object...
         if(!app.CreateDispatch("Excel.Application"))
         {
            AfxMessageBox("Couldn't start Excel.");
         }
         else
         {
            //Make Excel Visible and display a message
          app.SetVisible(TRUE);
          AfxMessageBox ("Excel is Running!");
         }
      }
9.生成并运行项目。结果:单击对话框中的“运行”按钮时,将启动 Microsoft Excel。激活“Auto_Excel”对话框并关闭消息框。CAutoProjectDlg::OnRun() 函数结束时,Microsoft Excel 将退出,因为这时应用程序变量超出了作用域。虽然以上步骤阐述了如何使 Microsoft Excel 自动运行,但您还可以使用同样的方法使其他应用程序自动运行。
 
二 
VC操作Word2003例子
Sample Code:
_Application objWord; //定义Word应用程序对象(Word.application)

// Convenient values declared as ColeVariants.
COleVariant covTrue((short)TRUE),
covFalse((short)FALSE),
covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);

// Get the IDispatch pointer and attach it to the objWord object.
if (!objWord.CreateDispatch("Word.Application"))
{
AfxMessageBox("Couldn't get Word object.");
return;
}

objWord.SetVisible(TRUE);  //This shows the application.

Documents docs(objWord.GetDocuments());//定义Word Documents对象(Word.Documents)

_Document testDoc; //定义Word Document对象(Word.Document)

testDoc.AttachDispatch(docs.Open( //可看成VB语句set testDoc = Word.documents.Open(…)
COleVariant("C://Test.doc",VT_BSTR),
covFalse,    // Confirm Conversion.
covFalse,    // ReadOnly.
covFalse,    // AddToRecentFiles.
covOptional, // PasswordDocument.
covOptional, // PasswordTemplate.
covFalse,    // Revert.
covOptional, // WritePasswordDocument.
covOptional, // WritePasswordTemplate.
covOptional) // Format. // Last argument for Word 97
covOptional, // Encoding // New for Word 2000/2002
covTrue,     // Visible
covOptional, // OpenConflictDocument
covOptional, // OpenAndRepair
(long)0,     // DocumentDirection wdDocumentDirection LeftToRight
covOptional  // NoEncodingDialog
)  // Close Open parameters
); // Close AttachDispatch(?)

AfxMessageBox("Now printing 2 copies on the active printer");

testDoc.PrintOut(covFalse,              // Background. //可看成VB语句testDoc.PrintOut(…)
covOptional,           // Append.
covOptional,           // Range.
covOptional,           // OutputFileName.
covOptional,           // From.
covOptional,           // To.
covOptional,           // Item.
COleVariant((long)2),  // Copies.
covOptional,           // Pages.
covOptional,           // PageType.
covOptional,           // PrintToFile.
covOptional,           // Collate.
covOptional,           // ActivePrinterMacGX.
covOptional            // ManualDuplexPrint.
covOptional,           // PrintZoomColumn  New with Word 2002
covOptional,           // PrintZoomRow          ditto
covOptional,           // PrintZoomPaperWidth   ditto
covOptional);          // PrintZoomPaperHeight  ditto

// If you wish to Print Preview the document rather than print it,
// you can use the PrintPreview member function instead of the
// PrintOut member function:
//    testDoc[i].PrintPreview.

objWord.Quit(covFalse,  // SaveChanges.
covTrue,   // OriginalFormat.
covFalse   // RouteDocument.
);

You may need to modify the code in CAutoProjectDlg::OnRun() to indicate the correct path for your document Test.doc. The document is referenced in the  following line:

testDoc.AttachDispatch(docs.Open(
COleVariant("C://My Docs//Test.doc",VT_BSTR)...

 
 

 
   下面介绍在VS2005或2008中进行自动化时的注意点:
项目->添加类->MFC->Typelib中的MFC类,根据你的需求,添加对应的类。

在VS2005中添加的这些类和VC6不一样:在工程中只多了这几个头文件.h ,没有.cpp文件;类名及成员函数也发生了一些变化,使用的时候可以参考VC6的函数然后再到类中找相应的函数;每个类都对应一个头文件。

按照老步骤去做最后在编译时会出现许多错误,原因是MFC 类向导不能解决 Windows api 与 COM 接口方法的命名冲突,这时可以改名。

在所得的每个头文件中将
#import "C://Program Files//Microsoft Office//OFFICE11..."     删除
在stdafx.h中加入:
// mso
#import "libid:{2df8d04c-5bfa-101b-bde5-00aa0044de52}"  auto_rename
// vb6ext
#import "libid:{0002e157-0000-0000-c000-000000000046}"  auto_rename
// excel
#import "libid:{00020813-0000-0000-c000-000000000046}"  auto_rename
//word
#import "libid:{00020905-0000-0000-C000-000000000046}"  auto_rename
//ppt
#import "libid:{91493440-5A91-11CF-8700-00AA0060263B}"  auto_rename

再编译,不再报错,编译器自动生成文件.tlh”

有文章介绍,作如下改动:
#import "C://Program Files//Common Files//Microsoft Shared//OFFICE11//mso.dll"  /
 rename("RGB", "MSRGB")
#import "C://Program Files//Common Files//Microsoft Shared//VBA/VBA6//VBE6EXT.OLB"  /
 raw_interfaces_only  /
 rename("VBE", "testVBE")
#import "C://Program Files//Microsoft Office//OFFICE11//MSWORD.OLB"  /
 rename_namespace("Word")  raw_interfaces_only  /
 rename("FindText","_FindText")    /
 rename("Rectangle","_Rectangle")   /
 rename("ExitWindows","_ExitWindows"):

 #import "C://Program Files//Microsoft Office//Office11//EXCEL.EXE"  no_namespace  /
 exclude("IFont", "IPicture") /
 rename("RGB", "ignorethis") /
 rename("DialogBox","ignorethis") /
 rename("VBE", "testVBE")  /
 rename("ReplaceText","EReplaceText")  /
 rename("CopyFile","ECopyFile") /
 rename("FindText", "EFindText") /
 rename("NoPrompt", "ENoPrompt")
其实单个word时尚可,同时含excel就不能通过,希望高手指出解决方法。

当然,我把每个头文件中#import ...这一行语句删除,也不会出错。

由于在以前版本的 MFC 能正确识别这种情况,并在包装类中的方法名称前追加一个下划线 (_)以防出错。因此可以把VC6中生成的文件导入到项目中(同时要包括.cpp文件)这种方法更简单。

还是用C#方便,语法简洁。

 另请参考文章:http://support.microsoft.com/kb/316587/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐