OLE程序开发利用(开发EXCEL)

原创 2001年11月02日 09:22:00

OLE程序开发利用(开发EXCEL)
一、首先打开类向导(MFC ClassWizard) 选择Add Class按钮中的 From a type library...找到
 Office 目录下的文件 EXCEL9.OLB 并打开。
二、在Confirm Class中的类框中选择你所需的类(EXCEL中的对象)后按OK按钮后依次添加  _Application 、Workbooks 、_Workbook 、Worksheets 、_Worksheet 和 Range类。
三、添加头文件
 #include <comdef.h>
 #include "excel9.h" 
四、代码如下:


void CParameterApp::CreateRepTemp()
{
 _Application ExcelApp;
 Workbooks wbsMyBooks;
 _Workbook wbMyBook;
 Worksheets wssMysheets;
 _Worksheet wsMysheet;
 Range rgMyRge;
 CString strSqlStmt;
 CString strRepTemplate="c://报表//报表.xlt";

///////////////////////////////////////////////////////////////////////////
 CFileFind filefind;
 int iFileExist= filefind.FindFile((LPCTSTR)strRepTemplate);

///////////////////////////////////////////////////////////////////////////
 if(CoInitialize(NULL)!=0)
 {
  AfxMessageBox("初始化COM支持库失败!");
  exit(1);
 }


   COleException *e = new COleException;
  
 try
 {
  if(!ExcelApp.CreateDispatch("Excel.Application.9",e))                                                                                                                                                                                                                                                                                     
                                                    
   throw e; 
  
  }

    catch (COleDispatchException * e)
   {
      CString cStr;

      if (!e->m_strSource.IsEmpty())
         cStr = e->m_strSource + " - ";
      if (!e->m_strDescription.IsEmpty())
         cStr += e->m_strDescription;
      else
         cStr += "unknown error";

      AfxMessageBox(cStr, MB_OK,
         (e->m_strHelpFile.IsEmpty())? 0:e->m_dwHelpContext);

      e->Delete();
   }
 
 ExcelApp.SetCaption(_T("FARAD 200D 报表模板设置"));
 file://得到Workbooks
 wbsMyBooks.AttachDispatch(ExcelApp.GetWorkbooks(),true); 
 
 if( iFileExist)
 {
  wbMyBook.AttachDispatch(wbsMyBooks.Add(_variant_t((CString)strRepTemplate)));
  file://wbMyBook.SetSaved(true);
  file://ExcelApp.GetSaveAsFilename (vtMissing,vtMissing,vtMissing,vtMissing,_variant_t("vtMissing"));
  file://wbMyBook.Save ();
  file://("xlShared")
  file://wbMyBook.SaveAs(_variant_t("d://我的工作表.xls"),_variant_t("xlAddIn"),vtMissing,vtMissing,vtMissing,vtMissing,_variant_t(long (1)),_variant_t("xlUserResolution"),vtMissing,vtMissing,vtMissing);
  file://运行宏(CString)
  ExcelApp.Run(_variant_t("auto_open"),vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing
   ,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing
   ,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing
   );

  ExcelApp.SetVisible(true);
  ExcelApp.ReleaseDispatch();

 }

 else
 {
 CString strSQL=_T("SELECT 报表名称 FROM 报表设置表 ");
 PrePareRepName(strSQL);

 wbMyBook.AttachDispatch(wbsMyBooks.Add(vtMissing));


 file://得到Worksheets
 wssMysheets.AttachDispatch(wbMyBook.GetWorksheets(),true);

 file://得到sheet1
// wsMysheet.AttachDispatch(wssMysheets.GetItem(_variant_t("sheet1")),true);
 wsMysheet.AttachDispatch(wssMysheets.GetItem(_variant_t((long)1)),true);
 wsMysheet.SetName(_T("AI"));


 file://得到全部Cells,此时,rgMyRge是cells的集合
 rgMyRge.AttachDispatch(wsMysheet.GetCells(),true);
 file://设置单元的值
  strSqlStmt=PrepareSQL("AI历史表");// 获得查询语句
 SetTemplateData(&rgMyRge,strSqlStmt);
 
 file://得到所有的列
 rgMyRge.AttachDispatch(wsMysheet.GetColumns(),true);
 file://设置列宽
 rgMyRge.SetColumnWidth(_variant_t((long)15));
 file://设置对齐方式
 rgMyRge.SetHorizontalAlignment(_variant_t(BYTE(3)));//3:居中

 file://得到sheet2
 wsMysheet.AttachDispatch(wssMysheets.GetItem(_variant_t((long)2)),true);
 wsMysheet.SetName(_T("COUNTER"));


 file://得到全部Cells,此时,rgMyRge是cells的集合
 rgMyRge.AttachDispatch(wsMysheet.GetCells(),true);

 file://设置单元的值
 strSqlStmt=PrepareSQL("COUNTER历史表");// 获得查询语句
 SetTemplateData(&rgMyRge,strSqlStmt);

 file://得到所有的列
 rgMyRge.AttachDispatch(wsMysheet.GetColumns(),true);
 file://设置列宽
 rgMyRge.SetColumnWidth(_variant_t((long)15));
 file://设置对齐方式
 rgMyRge.SetHorizontalAlignment(_variant_t(BYTE(2)));//2:左对齐


 file://得到sheet3
 wsMysheet.AttachDispatch(wssMysheets.GetItem(_variant_t((long)3)),true);
 wsMysheet.SetName(m_strRepNameArray[0]);
 wsMysheet.Activate();
// wsMysheet.SetVisible((long)0);//使sheet3不可视
 ExcelApp.SetVisible(true);

 file://添加所有的报表表单

  AddSheet(wssMysheets, wsMysheet);
file://运行宏
  ExcelApp.Run(_variant_t((CString)"宏2"),vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing
   ,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing
   ,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing
   );
 
 wbMyBook.SetSaved(true);
 ExcelApp.SetVisible(true);
 file://保存文件
 wbMyBook.SaveCopyAs(_variant_t((CString)strRepTemplate));

 file://释放对象
 if(m_strRepNameArray.GetSize()>0)
  m_strRepNameArray.RemoveAll();

 rgMyRge.ReleaseDispatch();
 wsMysheet.ReleaseDispatch();
 wssMysheets.ReleaseDispatch();
 wbMyBook.ReleaseDispatch();
 wbsMyBooks.ReleaseDispatch();
 ExcelApp.ReleaseDispatch();
 }
 
 CoUninitialize();
 
}
void CParameterApp::SetTemplateData(Range *pRgMyRge, CString strSQL)
{
 char prefixion[34][3]={"C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T",
 "U","V","W","X","Y","Z","AA","AB","AC","AD","AE","AF","AG","AH","AI","AJ",};

 CODBCDynamic odbcDynamic(_T("Report"),"sa","");// 动态连接数据源
    try
  { 
   // 执行查询
   odbcDynamic.ExecuteSQL( strSQL );
  if(odbcDynamic.m_bError)
  {
   AfxMessageBox("对不起,无此数据",MB_OK);
   return;
  }
  
   // 显示查询结果集
   int irecordnum=odbcDynamic.m_ODBCRecordArray.GetSize();//当前记录数
 
   // 添加结果集记录
  
   for (int iRecord = 0; iRecord < irecordnum; iRecord++)//此for循环只执行了irecordnum=0
   {   
    CString strColName="";
    CDBVariantEx* pvarValue=NULL;
    char szValue[255];
   CObArray *pcolarray =(CObArray*)odbcDynamic.m_ODBCRecordArray.GetAt(0);
    
    int num=pcolarray->GetSize();//num为表的行数与列数的乘积
    
     for(int j=0;j<num;j++)//用j进行计数
     {
      CODBCRecord* pODBCRecord=(CODBCRecord*)pcolarray->GetAt(j);
      
      strColName=pODBCRecord->m_strcolname;//列名
      pODBCRecord->m_pvar->GetStringValue(szValue);//值
     file://Excel中行列计数是以1为基
     if(j<num/irecordnum)
      pRgMyRge->SetItem(_variant_t((long)1),_variant_t((long)(j+1)),_variant_t(strColName));
       
      if (0 <= strlen(szValue))
      {
      int irow=j/(num/irecordnum)+2;//行号
      int icol=j%(num/irecordnum)+1;//列号
      if((irow>=2)&&(icol>=3))
      {
       char val[8];
       char postfixion[8];
       _itoa(irow,postfixion,10);
       strcpy(val,prefixion[icol-3]);
       strcat(val,postfixion);

       pRgMyRge->SetItem(_variant_t((long)irow),_variant_t((long)icol),_variant_t(val));

      }
      else
      {
       pRgMyRge->SetItem(_variant_t((long)irow),_variant_t((long)icol),_variant_t(szValue));
      }
     }
     
     }break; 
  }
  }
 
  catch (CUserException* pe)
  {
   pe->ReportError();
   pe->Delete();
  }

 return ;
}

_Worksheet CParameterApp::AddSheet(Worksheets &worksheets, _Worksheet &worksheet)
{
file://添加所有的表单
 _Worksheet worksheettemp;
 CString strSelRepName;
 int nCount =m_strRepNameArray.GetSize();

 for(int i=1/*0*/;i<nCount;i++)
 {
 
  strSelRepName=m_strRepNameArray[i];
  
  worksheettemp.AttachDispatch(worksheets.Add(vtMissing,_variant_t(worksheet),vtMissing,vtMissing),true);
  worksheettemp.SetName(strSelRepName);
  worksheet.AttachDispatch(worksheet.GetNext(),true);

 }
 return worksheettemp;
}


 

OLE程序开发利用(开发EXCEL) 之二

ExcelApp.SetVisible(true);  ExcelApp.ReleaseDispatch(); } else { CString strSQL=_T("SELECT 报表名称 FROM...
  • hnhbdss
  • hnhbdss
  • 2006年10月27日 16:50
  • 771

傻瓜式教学:c++操作Excel

理论性的东西就是不讲了,简单的ji
  • linjinxing1987
  • linjinxing1987
  • 2014年07月05日 03:18
  • 2040

浅谈C/C++ 开发Excel插件之操作excel

想在加载项中访问并操作Excel,需要在stdafx.h中加入如下语句,注意实际路径和本机安装Office的路径相关 #import "C:\\Program Files (x86)\\Co...
  • xpg4321
  • xpg4321
  • 2016年09月06日 16:28
  • 860

C语言 SDK编程之数据库编程--ODBC数据源 API的使用

一、windows下数据库的编程接口有以下几种    ODBC   API    DAO    OLEDB    ADO    ADO.NET       其中odbc是函数形式的接口    dao,...
  • c395565746c
  • c395565746c
  • 2010年04月28日 18:00
  • 2707

OLE程序开发利用(开发EXCEL) 之 一

OLE程序开发利用(开发EXCEL)一、首先打开类向导(MFC ClassWizard) 选择Add Class按钮中的 From a type library...找到 Office 目录下的文件 ...
  • hnhbdss
  • hnhbdss
  • 2006年10月27日 16:49
  • 729

OLE程序开发利用(开发EXCEL) 之三

 pRgMyRge->SetItem(_variant_t((long)irow),_variant_t((long)icol),_variant_t(val));      }      else ...
  • hnhbdss
  • hnhbdss
  • 2006年10月27日 16:52
  • 546

OLE操作EXCEL总结点

1、必须装完整版的OFFICE,否则EXCEL服务
  • hao1183716597
  • hao1183716597
  • 2014年04月26日 17:50
  • 753

最全的OLE操作Excel的完整代码(2)

/*------------------------------------------------- //目前真正最全的OLE操作Excel的完整代码 //版本:2007.01.15.01 /...
  • yedezhanghao
  • yedezhanghao
  • 2012年04月16日 20:10
  • 2855

C++读写EXCEL文件---ole 方式

使用MFC操作EXCEL文件 一、加载 1、 在VC6.0里创建一个MFC工程 2、打开MFCClassWizard窗口(查看—>建立类向导),选择Automation,单击AddClass按钮...
  • iamherego
  • iamherego
  • 2016年06月23日 14:14
  • 3085

以OLE方式读写EXCEL的C++类【转载】

◆C++中的【L"https://msdn.microsoft.com/library"】。 这个是C++标准规定的写法。详见以下链接: http://bbs.csdn.net/topics/3906...
  • u013600225
  • u013600225
  • 2016年03月20日 08:21
  • 1398
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OLE程序开发利用(开发EXCEL)
举报原因:
原因补充:

(最多只允许输入30个字)