MFC中操作office软件(doc和excel)

12 篇文章 0 订阅

 

 

程序来源:http://www.codeproject.com/KB/COM/xoffice.aspx?msg=2876047

在执行该程序时出现:codefans.net\callmsoffice\office.h(10) : fatal error C1083: Cannot open type library file: 'C:\Program Files\Microsoft Office\Office\MSO9.DLL': No such file or directory

原因分析:例程中的程序对应的是word2000的动态链接库,和2007的链接库不同。在office.h中

将 :

      #import "C:\Program Files\Microsoft Office\Office\MSO9.DLL"
      #import "C:\Program Files\Common Files\Microsoft Shared\VBA\VBA6\VBE6EXT.OLB"
      #import "C:\Program Files\Microsoft Office\Office\MSWORD9.OLB" \
      rename("ExitWindows","_ExitWindows")
      #import "C:\Program Files\Microsoft Office\Office\EXCEL9.OLB" \
      rename("DialogBox","_DialogBox") \
      rename("RGB","_RGB") \
      exclude("IFont","IPicture")

修改为:

      #import "C:\Program Files\Common Files\Microsoft Shared\OFFICE12\mso.dll"
      #import "C:\Program Files\Common Files\Microsoft Shared\VBA\VBA6\VBE6EXT.OLB"
      #import "C:\Program Files\Microsoft Office\Office12\MSWORD.olb"\
      rename("ExitWindows","_ExitWindows")
      #import "C:\Program Files\Microsoft Office\Office12\excel.exe" exclude("IFont", "IPicture") \
      rename("DialogBox","_DialogBox") \
      rename("RGB","_RGB") \

至此程序正常执行。

 

2.VC创建Excel写入内容 来源:http://blog.csdn.net/augusdi/article/details/6612027(版本为:vs2003,word2003)

改为:vs2005,word2007的程序如下:

 

#include "stdafx.h"

#include <iostream>  
 
using namespace std ; 
  /*

//*号部分为程序原来部分
#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("Reference", "ignorethis"), rename("VBE", "JOEVBE") 
 
#import "C:\Program Files\Microsoft Office\OFFICE11\excel.exe" exclude("IFont", "IPicture") \

rename("RGB""ignorethis"), rename("DialogBox""ignorethis"), rename("VBE""JOEVBE"), \  

rename("ReplaceText""JOEReplaceText"), rename("CopyFile","JOECopyFile"), \  

rename("FindText""JOEFindText"), rename("NoPrompt""JOENoPrompt")  

using namespace Office;  

using namespace VBIDE;  

using namespace Excel ;  
*/

 

//程序修改部分
#import "C:\Program Files\Common Files\Microsoft Shared\OFFICE12\mso.dll"rename("RGB", "MSRGB")
#import "C:\Program Files\Common Files\Microsoft Shared\VBA\VBA6\VBE6EXT.OLB"raw_interfaces_only,rename("Reference", "ignorethis"), rename("VBE", "JOEVBE") 

#import "C:\Program Files\Microsoft Office\Office12\excel.exe" exclude("IFont", "IPicture") rename("RGB", "ignorethis"), rename("DialogBox", "ignorethis"), rename("VBE", "JOEVBE"), rename("ReplaceText", "JOEReplaceText"), rename("CopyFile","JOECopyFile"), rename("FindText", "JOEFindText"), rename("NoPrompt", "JOENoPrompt") ,rename_namespace("Excel")

using namespace Excel ; 

int ExportExcelFile() ; 
 
int _tmain(int argc, _TCHAR* argv[])

   if(FAILED(::CoInitialize(NULL))) 
        return 1 ; 
 
    ExportExcelFile() ; 
 
    ::CoUninitialize(); 
 
   return 0; 

 
int ExportExcelFile() 

    _ApplicationPtr pApplication = NULL ; 
   _WorkbookPtr pThisWorkbook = NULL ; 
    _WorksheetPtr pThisWorksheet = NULL ; 
    SheetsPtr pThisSheets = NULL ; 
    RangePtr pThisRange = NULL ; 
   _variant_t vt ; 
   Excel::XlFileFormat vFileFormat ; 
   Excel::XlSaveAsAccessMode vSaveAsAccessMode ; 
    Excel::XlSaveConflictResolution vSaveConflictResolution ; 
 
   pApplication.CreateInstance("Excel.Application"); 
    pApplication->PutVisible (0,VARIANT_TRUE); 
    pThisWorkbook = pApplication->GetWorkbooks()->Add() ; 
    pThisSheets = pThisWorkbook->GetWorksheets() ; 
    pThisWorksheet = pThisSheets->GetItem((short)1); 
  // 设置整个sheet的填充色为白色  
   pThisWorksheet->GetCells()->GetInterior()->PutColor(RGB(255, 255, 255)); 
    pThisWorksheet->GetCells()->ClearContents() ; 
   pThisRange = pThisWorksheet->GetRange("A1:C5") ; 
   pThisRange->ClearFormats() ; 
   // 如果有不会的,可以在debug文件夹的excel.tlh里找找  
    //pThisRange->GetItem(1,1) ;  
    pThisRange->PutItem(1, 1, _variant_t("哈尔滨市平房区")) ; 
    pThisRange->PutItem(1, 2, _variant_t("高宏伟")) ; 
    pThisRange->PutItem(1, 3, _variant_t("QQ:21807822")) ; 
    pThisRange->PutItem(2, 1, _variant_t("1")) ; 
   pThisRange->PutItem(3, 1, _variant_t("2")) ; 
   pThisRange->PutItem(4, 1, _variant_t("3")) ; 
   pThisRange->PutItem(5, 1, _variant_t("4")) ; 
   // 为Range的四周和内部加上边框  
   pThisRange->GetBorders()->GetItem(xlEdgeLeft)->PutLineStyle(xlContinuous) ; 
    pThisRange->GetBorders()->GetItem(xlEdgeTop)->PutLineStyle(xlContinuous) ; 
   pThisRange->GetBorders()->GetItem(xlEdgeRight)->PutLineStyle(xlContinuous) ; 
   pThisRange->GetBorders()->GetItem(xlEdgeBottom)->PutLineStyle(xlContinuous) ; 
    pThisRange->GetBorders()->GetItem(xlInsideHorizontal)->PutLineStyle(xlContinuous) ; 
    pThisRange->GetBorders()->GetItem(xlInsideVertical)->PutLineStyle(xlContinuous) ; 
    // 设置第一行的格式(背景色、粗体、颜色、列宽)  
   pThisRange->GetRange("A1:C1")->GetInterior()->ColorIndex = 47 ; 
   pThisRange->GetRange("A1:C1")->GetInterior()->Pattern = xlPatternSolid ; 
    pThisRange->GetRange("A1:C1")->GetFont()->ColorIndex = 6 ; 
    pThisRange->GetRange("A1:C1")->GetFont()->Bold = TRUE ; 
    pThisRange->GetEntireColumn()->ColumnWidth = 18.63 ; 
    pThisRange->GetRange("A2:C5")->GetInterior()->ColorIndex = 16 ; 
    pThisRange->GetRange("A2:C5")->GetInterior()->Pattern = xlPatternSolid ; 
   pThisRange->GetRange("A2:C5")->GetFont()->ColorIndex = 2 ; 
    // 冻结窗格  
    pApplication->ActiveWindow->FreezePanes = FALSE ; 
   pApplication->Range["A2"]->Select() ; 
    pApplication->ActiveWindow->FreezePanes = TRUE ; 
 
    // 存盘退出  
    vSaveAsAccessMode = xlNoChange ; 
   vFileFormat = xlWorkbookNormal ; 
   vSaveConflictResolution = xlLocalSessionChanges ; 
    pThisWorkbook->SaveAs(_variant_t("D:\\Visual Studio Projects\\VCReportDemo\\joe.xls"), vFileFormat,_variant_t(""),_variant_t(""), _variant_t(false), 
   _variant_t(false), vSaveAsAccessMode, vSaveConflictResolution, _variant_t(false)) ; 
    pThisWorkbook->Close(); 
   pApplication->Quit(); 
 
    return 0 ; 

 

 

附注:

Office类库
2008-11-25 11:15

office版本号                           类型库
   --------------------------------------------------

   Microsoft Access 97                   Msacc8.olb
   Microsoft Jet Database 3.5            DAO350.dll
   Microsoft Binder 97                   Msbdr8.olb
   Microsoft Excel 97                    Excel8.olb
   Microsoft Graph 97                    Graph8.olb
   Microsoft Office 97                   Mso97.dll
   Microsoft Outlook 97                  Msoutl97.olb
   Microsoft PowerPoint 97               Msppt8.olb

   Microsoft Word 97                     Msword8.olb
   Microsoft Access 2000                 Msacc9.olb
   Microsoft Jet Database 3.51           DAO360.dll
   Microsoft Binder 2000                 Msbdr9.olb
   Microsoft Excel 2000                  Excel9.olb
   Microsoft Graph 2000                  Graph9.olb
   Microsoft Office 2000                 Mso9.dll
   Microsoft Outlook 2000                Msoutl9.olb
   Microsoft PowerPoint 2000             Msppt9.olb
   Microsoft Word 2000                   Msword9.olb

   Microsoft Access 2002                 Msacc.olb
   Microsoft Excel 2002                  Excel.exe
   Microsoft Graph 2002                  Graph.exe
   Microsoft Office 2002                 MSO.dll
   Microsoft Outlook 2002                MSOutl.olb
   Microsoft PowerPoint 2002             MSPpt.olb
   Microsoft Word 2002                   MSWord.olb

   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

上面你可能注意到了,office2002和office2003怎么有类型库在exe中?
我也不知道ms为啥把它放进去,不过用import一样的导入。

下面我以office2003为例写的一个例子:

#import "C:\\Program Files\\Common Files\\system\\ado\\msado21.tlb" no_namespace \
rename ("EOF", "adoEOF")

#import "C:\\Program Files\\Common Files\\Microsoft Shared\\DAO\\DAO360.DLL" rename("EOF","EndOfFile") \
rename("BOF","BegOfFile")

#import "C:\Program Files\\Common Files\\Microsoft Shared\\Office11\\MSO.DLL" rename_namespace("Office")
using namespace Office;

#import "C:\\Program Files\\Common Files\\Microsoft Shared\\VBA\\VBA6\\VBE6EXT.olb" rename_namespace("VBE6")
using namespace VBE6;

#import "C:\Program Files\Microsoft Office\Office11\MSWORD.olb" rename("ExitWindows","ExitWindowsEx"),named_guids,rename_namespace("MSWord")
using namespace MSWord;

#import "C:\Program Files\Microsoft Office\Office11\MSACC.olb" implementation_only,rename_namespace("MSACC")
using namespace MSACC;

#import "C:\Program Files\Microsoft Office\Office11\MSPPT.olb" implementation_only,rename_namespace("MSPPT")
using namespace MSPPT;

#import "C:\\Program Files\\Microsoft Office\\Office11\\Excel.exe" rename("RGB","RGBEx"),rename("DialogBox","DialogBoxEx"),rename_namespace("MSExcel")
using namespace MSExcel;

说明:
1、前四个的路径都是默认的,后四个根据版本不同更改即可!
2、ado和dao是为了支持Access的,如果你不是操作Access那么可以去掉他们!
3、office和VBE6是必须的,我们每次都会用到!

下面给一个简单例子:
int _tmain(int argc, _TCHAR* argv[])
{
//Initialize the COM libraries
::CoInitialize(NULL);

std::cout<<"Begin clear!"<<std::endl;

// Create an instance of the Word application and obtain the
// pointer to the application's IDispatch interface.
CLSID clsidWord;
CLSIDFromProgID(L"Word.Application", &clsidWord);

IUnknown* pUnk;

HRESULT hr = GetActiveObject(clsidWord, NULL, (IUnknown**)&pUnk); //得到当前打开的word的接口指针
        //你也可以用CoCreateInstance(...)去创建!

        MSWord::_ApplicationPtr pApplication = pUnk;
//...
::CoUninitialize();
std::cout<<"Finish!---Thanks!"<<std::endl;
system("PAUSE");
return 0;
}

Office 2007

#import "C:\\Program Files\\Microsoft Office\\OFFICE12\\MSWORD.OLB" rename "ExitWindows","ExitWindowsEx"),named_guids,rename_namespace("MSWord")
using namespace MSWord;

 

参考文献:http://www.codeproject.com/KB/COM/xoffice.aspx?msg=2876047

                http://blog.csdn.net/augusdi/article/details/6612027

                http://hi.baidu.com/zmax2007/blog/item/39295b8661a8463966096ecd.html

               

 

 

     

        

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值