C++通过ATL访问Excel时 使用COleSafeArray批量读写数据及公式

文章介绍了在C++中使用ATL库操作Excel文件时,如何通过COleSafeArray提高读写效率。通过创建COleSafeArray对象并设置其维度和边界,可以实现对Excel单元格的批量读写,包括写入公式并批量计算。示例代码展示了如何创建安全数组,填充数据并写入Excel,以及如何读取数据。

C++软件开发中,利用ATL操作Excel文件时,通常是对每个单元格依次操作,读写效率较低;写入时如果包含公式,Excel还会进行运算,严重影响用户使用体验。为改进读写速度,考虑同时对多个单元格进行读写操作,需要使用COleSafeArray对CRange的内容进行批量读写。

前提

需要引入Excel的类型库,可以采用import方式,也可直接导入已有的CApplication.h、CWorkbooks.h、CWorkbook.h、CWorksheets.h、CWorksheet、CRange.h等头文件。

批量写入数据

首先声明一个COleSafeArray变量,然后通过COleSafeArray::Create方法创建改变量,Create方法定义如下:
void Create(VARTYPE vtSrc, DWORD dwDims, DWORD rgElements);*
参数vtSrc为该变量内存储数据的类型,可根据写入数据类型进行选择如VT_BSTR(字符串类型)或VT_I8(整数类型)等;如果写入数据包含多个类型,可使用VT_VARIANT来写入。
参数dwDims用来定义维度,读写Excel是通常是1维或2维。
参数rgElements维指向定义了各维度边界的数组。

编写过程中建议使用COleVariant类型代替VARIANT类型数据,COleVariant是对VARIANT的封装,使用更安全方便。

实现代码:

BOOL CSafeArrayTestDlg::WriteExcelBySafeArray(CString strFilePath/*保存文件路径*/)
{
   
   
	COleVariant  covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);

	CApplication    elApp;
	CWorkbook	elBook;
	CWorksheet	elSheet;
	CWorkbooks	elBooks;
	CWorksheets	elSheets;
	CRange	elRange, elAllRange;

	if (!elApp.CreateDispatch(_T("Excel.Application"), NULL))
		return FALSE;

	// 是否允许其他用户控制Excel
	elApp.put_UserControl(FALSE);
	// Excel是否可视
	elApp.put_Visible(FALSE);
	// 程序是否显示告警
	elApp.put_DisplayAlerts(FALSE);
	LPDISPATCH  lpDisp;          //接口指针

	elBooks.AttachDispatch(elApp.get_Workbooks());
	elBook.AttachDispatch(elBooks.Add(covOptional));
	elSheet.AttachDispatch(elBook.get_ActiveSheet());
	elAllRange.AttachDispatch(elSheet.get_Cells());

	//通过起始单元格和结束单元格定位elRange
	elRange.AttachDispatch(elSheet.get_Range(elAllRange.get_Item(COleVariant(long(1)), COleVariant(long(1))), elAllRange.get_Item(COleVariant(long(2)), COleVariant(long(2)))));

	COleSafeArray   saRet;             //定义一个安全数组SAFEARRAY  

	DWORD   numElements[2];           //定义各维度边界数组  
	numElements[0] = 2;         //   在elRange中的行数.  
	numElements[1] = 2;         //   在elRange中的列数.  

	long index[2];				//单元格在elRange中行号列号的数组
	//创建一个VARIANT类型的COleSafeArray
	saRet.Create(VT_VARIANT, 2, numElements);

	//为安全数组saRet内各个元素赋值
	//可以为整形、字符串、浮点行、公式等
	index[0] = 0;
	index[
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值