首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

vc++实现office自动化编程,环境搭建有关问题

2013-08-04 
vc++实现office自动化编程,环境搭建问题VC++6.0中通过如下代码导入:#import office/MSO.DLL rename(Doc

vc++实现office自动化编程,环境搭建问题
VC++6.0中通过如下代码导入:
#import "office/MSO.DLL" rename("DocumentProperties","xpDocumentProperties"),rename_namespace("Office")
using namespace Office;

#import "office/VBE6EXT.olb" rename_namespace("VBE6")
using namespace VBE6;

#import "office/MSWORD.olb" rename("ExitWindows","ExitWindowsEx"),named_guids,rename_namespace("Word")
using namespace Word;

然后  Word::_ApplicationPtr m_App;
m_App->CreateDispatch(); //此句,指针未找到函数CreateDispatch()
求解惑……?

如果未找到的话,m_App将为空,无法使用m_App->GetDocuments();
注:vc++6.0新建 MFC 基于单文档模式视图工程后,在stdafx.h文件中加入如上代码,然后直接通过m_App找CreateDispatch,其余无操作。
1.是环境搭建有问题? 自动化 Office
[解决办法]
求交往!
要添加自动化支持,然后初始化COM库,最后调用m_app.CreateDispatch

m_App是智能指针,初始化要用“.”创建对象,然后就可以用->调用函数了
[解决办法]
m_App.CreateInstance(L"Word.Application")  ? 
[解决办法]
1.        首先要将excel类添加到工程中。
在ClassWizard中,【Add Class】,在Excel的安装目录找到Excel.exe(Microsoft2003,2007都是Excel.exe),添加必要的几个类:
// Excel应用对象
_Application   m_oExcelApp;              // Excel程序
_Worksheet            m_oWorkSheet;     // 工作表
_Workbook            m_oWorkBook;      // 工作簿
Workbooks            m_oWorkBooks;    // 工作簿集合
Worksheets            m_oWorkSheets;    // 工作表集合
Range                   m_oCurrRange;      // 使用区域
添加到工程中的文件是excel.h和excel.cpp。
2.        初始化Com库
if (CoInitialize(NULL)!=0) 


        AfxMessageBox("初始化COM支持库失败!"); 
        exit(1); 
}
3.        读取文件中的数据
       if (!m_oExcelApp.CreateDispatch( _T( "Excel.Application" ), NULL ) ) 
       {
              ::MessageBox( NULL, _T( "创建Excel服务失败!" ), _T( "错误提示!" ), MB_OK 
[解决办法]
 MB_ICONERROR); 
              exit(1); 
       }
       
       //设置为显示
       m_oExcelApp.SetVisible(FALSE);
       m_oWorkBooks.AttachDispatch( m_oExcelApp.GetWorkbooks(), TRUE ); //没有这条语句,下面打开文件返回失败。
       
       LPDISPATCH lpDisp = NULL;
       COleVariant covTrue((short)TRUE);
    COleVariant covFalse((short)FALSE);
    COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR); 
       Range            oCurCell;
 
       // 打开文件
       lpDisp = m_oWorkBooks.Open( strFilePath, 
                                      _variant_t(vtMissing), 
                                      _variant_t(vtMissing),
                                      _variant_t(vtMissing),
                                      _variant_t(vtMissing),
                                      _variant_t(vtMissing),


                                      _variant_t(vtMissing),
                                      _variant_t(vtMissing),
                                      _variant_t(vtMissing),
                                      _variant_t(vtMissing),
                                      _variant_t(vtMissing),
                                      _variant_t(vtMissing),
                                      _variant_t(vtMissing),
                                      _variant_t(vtMissing),
                                      _variant_t(vtMissing) );
       // 获得活动的WorkBook( 工作簿 )
       m_oWorkBook.AttachDispatch( lpDisp, TRUE );
       // 获得活动的WorkSheet( 工作表 )
       m_oWorkSheet.AttachDispatch( m_oWorkBook.GetActiveSheet(), TRUE );
       // 获得使用的区域Range( 区域 )
       m_oCurrRange.AttachDispatch( m_oWorkSheet.GetUsedRange(), TRUE );
 
       // 获得使用的行数
       long lgUsedRowNum = 0;


       m_oCurrRange.AttachDispatch( m_oCurrRange.GetRows(), TRUE );
       lgUsedRowNum = m_oCurrRange.GetCount();
       // 获得使用的列数
       long lgUsedColumnNum = 0;
       m_oCurrRange.AttachDispatch( m_oCurrRange.GetColumns(), TRUE );
       lgUsedColumnNum = m_oCurrRange.GetCount();
       // 读取Sheet的名称
       CString strSheetName = m_oWorkSheet.GetName();
 
       //得到全部Cells,此时,CurrRange是cells的集合 
       m_oCurrRange.AttachDispatch( m_oWorkSheet.GetCells(), TRUE ); 
 
       // 遍历整个Excel表格
       CStringArray* arrayStr;
       arrayStr = new CStringArray[lgUsedRowNum];
       for ( int i = 0; i < lgUsedRowNum; )
       {
              for ( int j = 1; j <= lgUsedColumnNum; )
              {
                     oCurCell.AttachDispatch( m_oCurrRange.GetItem( COleVariant( (long)(i + 1)), COleVariant( (long)j ) ).pdispVal, TRUE );
                     VARIANT varItemName = oCurCell.GetText();
                     CString strItemName;
                     strItemName = varItemName.bstrVal;
//                  AfxMessageBox( strItemName );
                     // 判断是否是合并的单元格
                     VARIANT varMerge = oCurCell.GetMergeCells();
                     if ( varMerge.boolVal == -1 )


                     {
//                         AfxMessageBox( _T( "是合并的单元格!" ) );
                     }
                     else if ( varMerge.boolVal == 0 )
                     {
//                         AfxMessageBox( _T( "不是合并的单元格!" ) );
                     }
 
                     arrayStr[i].Add( strItemName );
                     j++;
              }
              i++;
       }
       
       // 更新列表控件数据
       m_pExcelOperDlg->initListCtrlColumn( lgUsedColumnNum );
       m_pExcelOperDlg->updateListCtrlData( arrayStr, lgUsedRowNum );
 
       // 释放二维数组
       delete[] arrayStr;
 
       // 关闭
       m_oWorkBook.Close( covOptional, COleVariant( strFilePath ), covOptional );
       m_oWorkBooks.Close();
       // 释放
       m_oCurrRange.ReleaseDispatch();
       m_oWorkSheet.ReleaseDispatch();
       m_oWorkSheets.ReleaseDispatch();
       m_oWorkBook.ReleaseDispatch();
       m_oWorkBooks.ReleaseDispatch();
       m_oExcelApp.ReleaseDispatch();
       m_oExcelApp.Quit();  

热点排行