`
huozheleisi
  • 浏览: 1238392 次
文章分类
社区版块
存档分类
最新评论

OLE程序开发EXCEL

 
阅读更多

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 报表模板设置"));
//得到Workbooks
wbsMyBooks.AttachDispatch(ExcelApp.GetWorkbooks(),true);

if(iFileExist)
{
wbMyBook.AttachDispatch(wbsMyBooks.Add(_variant_t((CString)strRepTemplate)));
//wbMyBook.SetSaved(true);
//ExcelApp.GetSaveAsFilename(vtMissing,vtMissing,vtMissing,vtMissing,_variant_t("vtMissing"));
//wbMyBook.Save();
//("xlShared")
//wbMyBook.SaveAs(_variant_t("d://我的工作表.xls"),_variant_t("xlAddIn"),vtMissing,vtMissing,vtMissing,vtMissing,_variant_t(long (1)),_variant_t("xlUserResolution"),vtMissing,vtMissing,vtMissing);
//运行宏(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));


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

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


//得到全部Cells,此时,rgMyRge是cells的集合
rgMyRge.AttachDispatch(wsMysheet.GetCells(),true);
//设置单元的值
strSqlStmt=PrepareSQL("AI历史表");// 获得查询语句
SetTemplateData(&rgMyRge,strSqlStmt);

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

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


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

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

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


//得到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);

//添加所有的报表表单

AddSheet(wssMysheets, wsMysheet);
//运行宏
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);
//保存文件
wbMyBook.SaveCopyAs(_variant_t((CString)strRepTemplate));

//释放对象
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)
{
//添加所有的表单
_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;
}

分享到:
评论

相关推荐

    C# 采用OleDB读取EXCEL文件并导出

    功能描述: 1、选择当前路径下的所有xls文件(xls文件必须是统一格式); 2、选取Excel中某个sheet中的某几列读入到Dataset里面; 3、从Dataset导出到Excel表格 注:此代码运行是需有office组建...程序由VS2012开发。

    OLEDB读取Excel、csv出现字符串截断、丢失原因及其解决方案

    在应用程序的设计中,经常需要读取Excel数据或将Excel数据导入转换到其他数据载体中,例如将Excel数据通过应用程序导入SQL Sever等数据库中以备使用。笔者在开发“汽车产业链ASP协同商务平台”中遇到了类似需求。某...

    64位ODBC驱动程序 Access及Excel(无须删除原来的office方法)

    64位windows平台默认不安装Access的64位ODBC驱动,此下载将安装一系列组件,帮助在现有的 Microsoft ... 此外,还会安装 ODBC 和 OLEDB 驱动程序,供应用程序开发人员在开发与 Office 文件格式连接的应用程序时使用。

    64位ODBC驱动程序 Access 及 Excel

    64位windows平台默认不安装Access的64位ODBC驱动,此下载将安装一系列组件,帮助在现有的 Microsoft ... 此外,还会安装 ODBC 和 OLEDB 驱动程序,供应用程序开发人员在开发与 Office 文件格式连接的应用程序时使用。

    2007 Office system驱动程序:数据连接组件AccessDatabaseEngine

    此下载将安装一组组件,是解决「未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序。...此外,还会安装 ODBC 和 OLEDB 驱动程序,供应用程序开发人员在开发与 Office 文件格式连接的应用程序时使用。

    EXCEL64位ODBC驱动.rar

    4位windows平台默认不安装Access的64位ODBC驱动,此下载将安装一系列组件,帮助在现有的 Microsoft ... 此外,还会安装 ODBC 和 OLEDB 驱动程序,供应用程序开发人员在开发与 Office 文件格式连接的应用程序时使用。

    C#程序开发范例宝典(第2版).part08

    一部久享盛誉的程序开发宝典。精选570个典型范例,全面覆盖实用和热点技术,涉及面广,实用性强源于实际项目开发,帮助读者短时间掌握更多实用技术,提高编程水平范例经过精心编排,重点、难点突出,易学易懂书后...

    DELPHI专题文档-程序应用

    用Delphi 5.0编写OLE程序操纵Excel 用Delphi编写DLL实现动态改变分辨率 在delphi中使用flash控件 在Delphi中运用QuickReport实现多栏列印 控制INI文件几法 转让控制权 得到执行程序的目录 打开已注册文件 ...

    DELPHI专题--程序应用

    用Delphi 5.0编写OLE程序操纵Excel 用Delphi编写DLL实现动态改变分辨率 在delphi中使用flash控件 在Delphi中运用QuickReport实现多栏列印 控制INI文件几法 转让控制权 得到执行程序的目录 打开已注册文件 ...

    C#程序开发范例宝典(第2版).part12

    一部久享盛誉的程序开发宝典。精选570个典型范例,全面覆盖实用和热点技术,涉及面广,实用性强源于实际项目开发,帮助读者短时间掌握更多实用技术,提高编程水平范例经过精心编排,重点、难点突出,易学易懂书后...

    Excel 97 版

    Excel97 为开发兼容的OLE程序准备的较老版本

    PHP导出EXCEL 例子程序

    使用前确保你的PEAR OLE有成功安装,或者直接使用类似XMAPP这种集成开发环境。使用集成环境也要点击PHP中的go-pear.bat进行安装,然后记得去修改下APACHE的BIN中的PHP.INI文件对于PEAR的INCLUDE_PATH的路径。重启...

    64位ODBC驱动程序(可再发行包)

    此外,还会安装 ODBC 和 OLEDB 驱动程序,供应用程序开发人员在开发与 Office 文件格式连接的应用程序时使用。免积分下载链接 https://www.microsoft.com/zh-cn/download/confirmation.aspx?id=13255

    未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序报错的解决办法

    在开发.net项目中,通过microsoft.ACE.oledb读取excel文件信息时,报错: “未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序” 代码示例: static void Main(string[] args) { readexcel(D:\\test\...

    LabVIEW利用OLE自动化读写XML文件

    感谢微软提供了OLE技术,使得不同程序之间可以通过预先指定的接口互相调用。微软提供了MSXML2.0, 4.0 及 6.0动态链接库来支援开发人员读写XML文件。 而LabVIEW正可以通过OLE自动化接口,调用MSXML*.dll动态链接库...

    EXCELVBA宏教程

    该语言于1993年由微软公司发行 微软在1994年发行的Excel5 0版本中 即具备了VBA的宏功能 "&gt;Visual Basic for Applications(VBA)是Visual Basic的一种宏语言 是微软开发出来在其桌面应用程序中执行通用的自动化 OLE ...

    使用EclipseRCP进行桌面程序开发(四):在Windows中使用ActiveX控件

    OLE的体验,就是平时我们可以把Excel表格嵌入Word文档,或者把PDF嵌入浏览器显示一样,而ActiveX控件更是无处不在,做VB开发和网页开发的人都应该很熟悉。使用Windows系统中丰富的ActiveX控件资源,我们可以实现功能...

Global site tag (gtag.js) - Google Analytics