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[

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

被折叠的 条评论
为什么被折叠?



