惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 【当耐特】
K
Kaspersky official blog
V
Vulnerabilities – Threatpost
Hacker News - Newest:
Hacker News - Newest: "LLM"
Security Archives - TechRepublic
Security Archives - TechRepublic
S
Secure Thoughts
I
Intezer
TaoSecurity Blog
TaoSecurity Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Spread Privacy
Spread Privacy
A
About on SuperTechFans
NISL@THU
NISL@THU
The GitHub Blog
The GitHub Blog
Hugging Face - Blog
Hugging Face - Blog
S
Security @ Cisco Blogs
S
SegmentFault 最新的问题
G
Google Developers Blog
B
Blog
N
News and Events Feed by Topic
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Google DeepMind News
Google DeepMind News
V2EX - 技术
V2EX - 技术
V
Visual Studio Blog
MyScale Blog
MyScale Blog
Webroot Blog
Webroot Blog
Vercel News
Vercel News
IT之家
IT之家
Microsoft Security Blog
Microsoft Security Blog
Last Week in AI
Last Week in AI
Y
Y Combinator Blog
S
Security Affairs
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Stack Overflow Blog
Stack Overflow Blog
P
Proofpoint News Feed
L
Lohrmann on Cybersecurity
博客园 - 叶小钗
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Know Your Adversary
Know Your Adversary
T
Tailwind CSS Blog
F
Fortinet All Blogs
D
DataBreaches.Net
博客园 - Franky
博客园_首页
H
Heimdal Security Blog
宝玉的分享
宝玉的分享
阮一峰的网络日志
阮一峰的网络日志
Attack and Defense Labs
Attack and Defense Labs
Project Zero
Project Zero
雷峰网
雷峰网

博客园 - 黄金海岸

sqlite3环境配置-初始篇 linux-vi备查 QT设计之编译 QT设计之Designer H3C交换机配置命令大全 sqlite3小试牛刀 - 黄金海岸 - 博客园 sqlite3环境配置 利用 AXIS开发Webservice(一) —— 如何发布自己的webservice(转) 软件配置管理-团队开发的基石 VC常用数据类型使用转换详解(转载) vb和vc混合编程实例(ocx和dll) (转载) VC++中使用ADO方式操作ACCESS数据库(转载) 同行评审过程描述(四)——测量 同行评审过程描述(三)——走查步骤 同行评审过程描述(二)——评审步骤 同行评审过程描述(一)——概述(转载) Bugzilla windows安装红宝书(转载) 单元测试 单元测试的基本方法
在Visual C++ 中调用Excel 2000
黄金海岸 · 2007-11-03 · via 博客园 - 黄金海岸

Posted on 2007-11-03 16:30  黄金海岸  阅读(888)  评论()    收藏  举报

在开发软件时,经常要将数据输出到Excel 2000中,在Excel 2000中对该数据进行进一步地格式化处理或进行计算处理。在Visual Basic中处理起来较简单,Excel 2000的VB编程帮助中有较为详细的介绍。在Visual C++中如何进行处理了?利用Excel 2000的ActiveX Automate功能,处理起来同VB中类似。但要注意以下几点:

对于对象的属性值的读取或赋值,需要用GetProperty()或SetProperty(NewValue)函数,不能象VB中直接通过属性名称取值或赋值。例如:Worksheet.GetCount(), Worksheet.SetName(“Sheet1”)。

对 集合对象中的成员对象的引用,必须使用集合对象的GetItem()函数。例如:Worksheets.GetItem(ColeVariant ((long)1))或Worksheets.GetItem(ColeVariant(“Sheet1”))取得第一个工作表。

在COM接口中,时常用到Variant,BSTR,SafeArray数据类型。Variant数据类型是一个联合,可表示几乎所有的类型的数据,具体用法见MSDN中的相关介绍,类_variant_t是对VARIANT数据类型的封装。在Excel 2000的VB编程帮助中,如果提到某函数或属性需要一个值,该值的数据类型通常是Variant,在封装Excel 2000对象的类定义中,说明了具体需要的数据类型。BSTR是一个包括了字符串和字符串长度的数据结构,类_bstr_t是对BSTR数据类型的封装。在Excel 2000的VB编程帮助中提到的字符串通常指BSTR。具体函数参数或属性的数据类型,见封装该对象的类的定义。SafeArray是一个包括数组和数组边界的结构,数组边界外的内容不允许访问。在Excel 2000的VB编程帮助中提到的数组是指SafeArray。关于SafeArray的处理,请见MSDN的相关帮助。

对 于缺省参数和缺省值。在VB中,函数的参数可以空缺,在VC++中不允许,必须将所有的参数填写完全。如果你希望指定某个参数为缺省值,根据参数数据类型 的不同,可指定不同的缺省值。当参数数据类型为字符串时,可以用长度为0的字符串。如果参数是Variant类型,可用常量vtMissing,该常量在 comdef.h中定义。也可用_variant_t(DISP_E_PARAMNOTFOUND, VT_ERROR)产生一个Variant对象。

Excel对象中的集合对象有时包括的子对象是不一定的,例如:Range对象,可以表示Cell的集合,也可以表示Column的集合或Row的集合,Range.GetItem(1)可以返回Cell或Column或Row对象。

对对象的引用或传递对象,使用IDispatch类对象,有时利用Variant对IDispatch进行包装。

以 下是一段源程序,演示如何启动Excel 2000,利用一个模板文件产生一个新文档,在该文档的”Sheet1”工作表的第一个单元中填写一段文字,设置第一列的列宽,然后调用一个模板中的宏, 执行一段程序,最后打印预览该Excel文档。模板文件名称:MyTemplate.xlt。程序在Visual C++ 6.0 sp4,Windows 2000 Professional sp-1下调试通过。

首先利用Visual C++ 6.0,建立一个MFC基于对话框的工程项目,共享DLL,Win32平台。工程名称ExcelTest。在主对话框中加入一个按钮,

双击该按钮,增加成员函数void CExcelTestDlg::OnExceltest()。

在BOOL CExcelTestApp::InitInstance()中,dlg.DoModal();之前增加代码:

if (CoInitialize(NULL)!=0)

AfxMessageBox("初始化COM支持库失败!");

选 择Menu->View->ClassWizade,打开ClassWizade窗口,选择Add Class->From a type library,选择D:"Program Files"Microsoft Office"office"Excel9.OLB(D:"Program Files"Microsoft Office"是本机上Microsoft Office 2000的安装目录,可根据个人机器上的实际安装目录修改)。选择_Application、Workbooks、_Workbook、 Worksheets、_Worksheet、Range,加入新类,分别为_Application、Workbooks、_Workbook、 Worksheets、_Worksheet、Range,头文件Excel9.h,源文件Excel9.cpp。

在ExcelTestDlg.cpp文件的头部,#include "ExcelTestDlg.h"语句之下,增加 :

在void CExcelTestDlg::OnExceltest() 函数中增加如下代码:

void CExcelTestDlg::OnExceltest()

//创建Excel 2000服务器(启动Excel)

if (!ExcelApp.CreateDispatch("Excel.Application",NULL))

AfxMessageBox("创建Excel服务失败!");

wbsMyBooks.AttachDispatch(ExcelApp.GetWorkbooks(),true);

wbMyBook.AttachDispatch(wbsMyBooks.Add(_variant_t("g:""exceltest""MyTemplate.xlt")));

wssMysheets.AttachDispatch(wbMyBook.GetWorksheets(),true);

wsMysheet.AttachDispatch(wssMysheets.GetItem(_variant_t("sheet1")),true);

//得到全部Cells,此时,rgMyRge是cells的集合

rgMyRge.AttachDispatch(wsMysheet.GetCells(),true);

rgMyRge.SetItem(_variant_t((long)1),_variant_t((long)1),_variant_t("This Is A Excel Test Program!"));

rgMyRge.AttachDispatch(wsMysheet.GetColumns(),true);

rgMyRge.AttachDispatch(rgMyRge.GetItem(_variant_t((long)1),vtMissing).pdispVal,true);

rgMyRge.SetColumnWidth(_variant_t((long)200));

ExcelApp.Run(_variant_t("CopyRow"),_variant_t((long)10),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);

wbMyBook.PrintPreview(_variant_t(false));

rgMyRge.ReleaseDispatch();

wsMysheet.ReleaseDispatch();

wssMysheets.ReleaseDispatch();

wbMyBook.ReleaseDispatch();

wbsMyBooks.ReleaseDispatch();

ExcelApp.ReleaseDispatch();

添加完以上程序后,可运行看结果。

转自:http://www.vckbase.com/document/viewdoc/?id=231