C++使用VARIANT实现二维数组的操作、怎么使用COleSafeArray实现二维数组将字符串写入excel
配合OLED_V2的excel操作
C++使用VARIANT实现二维数组的操作
VARIANT变量是COM组件之间互相通信的重要的参数变量之一,它可以容纳多种不同的类型,如short、long、double等,包括各类指针和数组。组件之间的互相调用是比较耗时的,尤其带当组件位于不同进程中时,因此,减少传递次数是提高效率的一种有效方法。其中,Excel表格的操作就可能涉及到大量数据,一次传递一个二维数组是提高对Excel表的操作效率。下面以两种不同方式来实现VARIANT二维数组的操作。
1、使用SAFEARRAY实现二维数组
SAFEARRAY安全数组可以实现多维数组,SAFEARRAY实现的步骤可以大致分为三步。
(1)创建SAFEARRAY安全数组,包括设置数组元素的类型、数据的维数,大小等。
(2)对SAFEARRAY数组赋值,既可通过SafeArrayPutElement函数逐个元素进行负责,也可通过指针来获得SAFEARRAY的数据地址,然后对指针指向的值进行赋值操作。其中,如果SAFEARRAY中的数组时多维数组,即可以把多维数组转换为一维数组,也可以通过获得指向数组的指针方式来操作数组中的元素。
(3)使用VARIANT变量把SAFEARRAY进行包装。
使用SAFEARRAR实现二维数组的源代码如下:
VARTYPE vt = VT_I4; /*数组元素的类型,long*/SAFEARRAYBOUND sab[2]; /*用于定义数组的维数和下标的起始值*/sab[0].cElements = 2;sab[0].lLbound = 0;sab[1].cElements = 2;sab[1].lLbound = 0; /*创建一个2*2的类型为long的二维数组*/SAFEARRAY* psa = SafeArrayCreate(vt, sizeof(sab)/sizeof(SAFEARRAYBOUND), sab); if (NULL == psa){throw;}
/*通过指向数组的指针来对二维数组的元素进行间接赋值*/
long (*pArray)[2]= NULL;
HRESULT hRet = SafeArrayAccessData(psa, (void**)&pArray);
if (FAILED(hRet))
{
throw;
}
memset(pArray, 0,2*2*sizeof(long));
/*释放指向数组的指针*/
SafeArrayUnaccessData(psa);
pArray = NULL;
/*对二维数组的元素进行逐个赋值*/
long index[2]= {0,0};
long lFirstLBound= 0;
long lFirstUBound= 0;
long lSecondLBound= 0;
long lSecondUBound= 0;
SafeArrayGetLBound(psa, 1,&lFirstLBound);
SafeArrayGetUBound(psa, 1,&lFirstUBound);
SafeArrayGetLBound(psa, 2,&lSecondLBound);
SafeArrayGetUBound(psa, 2,&lSecondUBound);
for (long i= lFirstLBound; i<= lFirstUBound; i++)
{
index[0]= i;
for (long j= lSecondLBound; j<= lSecondUBound; j++)
{
index[1]= j;
long lElement= i * sab[1].cElements+ j;
HRESULT hRet = SafeArrayPutElement(psa, index,&lElement);
if (FAILED(hRet))
{
throw;
}
}
}
/*把SAFEARRAY转换为VARIANT*/
VARIANT var;
var.vt = VT_ARRAY| vt; /*vt必须和psa的数据类型保持一致*/
var.parray = psa;
SafeArrayDestroy(psa);
psa = NULL;
2、使用COleSafeArray实现二维数组
COleSafeArray继承于VARIANT,是MFC的自动化类,因此,只有在使用MFC类库时才能使用该类。COleSafeArray封装操作相关的函数,可通过MSDN查询该类的成员函数来了解与安全数组相关的函数。COleSafeArray还可以直接转换为VARIANT。因此,相对于SAFEARRAY,COleSafeArray的使用更方便。COleSafeArray和SAFEARRAY之间的关系就是MFC类库和Win32 SDK的关系,使用步骤类似。
使用COleSafeArray实现二维数组的源代码如下所示:
VARTYPE vt = VT_I4; /*数组元素的类型,long*/SAFEARRAYBOUND sab[2]; /*用于定义数组的维数和下标的起始值*/sab[0].cElements = 2;sab[0].lLbound = 0;sab[1].cElements = 2;sab[1].lLbound = 0;COleSafeArray olesa;olesa.Create(vt, sizeof(sab)/sizeof(SAFEARRAYBOUND), sab);
/*通过指向数组的指针来对二维数组的元素进行间接赋值*/
long (*pArray)[2]= NULL;
olesa.AccessData((void**)&pArray);
memset(pArray, 0,2*2*sizeof(long));
/*释放指向数组的指针*/
olesa.UnaccessData();
pArray = NULL;
/*对二维数组的元素进行逐个赋值*/
long index[2]= {0,0};
long lFirstLBound= 0;
long lFirstUBound= 0;
long lSecondLBound= 0;
long lSecondUBound= 0;
olesa.GetLBound(1,&lFirstLBound);
olesa.GetUBound(1,&lFirstUBound);
olesa.GetLBound(2,&lSecondLBound);
olesa.GetUBound(2,&lSecondUBound);
for (long i= lFirstLBound; i<= lFirstUBound; i++)
{
index[0]= i;
for (long j= lSecondLBound; j<= lSecondUBound; j++)
{
index[1]= j;
long lElement= i * sab[1].cElements+ j;
olesa.PutElement(index, &lElement);
}
}
/*把COleSafeArray变量转换为VARIANT*/VARIANT var = (VARIANT)olesa;
参考资料
http://blog.sina.com.cn/s/blog_74f586a50100rv6t.html
http://hfp0601.blog.163.com/blog/static/228483522011031104718762/
如何使用COleSafeArray实现二维数组将字符串写入excel
// VARTYPE vt = VT_BSTR ; /*数组元素的类型,string*/
VARTYPE vt = VT_I4; /*数组元素的类型,long*/
SAFEARRAYBOUND sabWrite[2]; /*用于定义数组的维数和下标的起始值*/
sabWrite[0].cElements = 1;
sabWrite[0].lLbound = 0;
sabWrite[1].cElements = 3;
sabWrite[1].lLbound = 0;
COleSafeArray olesaWrite;
olesaWrite.Create(vt, sizeof(sabWrite)/sizeof(SAFEARRAYBOUND), sabWrite);
/*通过指向数组的指针来对二维数组的元素进行间接赋值*/
long (*pArray)[2] = NULL;
olesaWrite.AccessData((void **)&pArray);
memset(pArray, 0, sabWrite[0].cElements * sabWrite[1].cElements * sizeof(long));
/*释放指向数组的指针*/
olesaWrite.UnaccessData();
pArray = NULL;
/*对二维数组的元素进行逐个赋值*/
long index[2] = {0, 0};
long lFirstLBound = 0;
long lFirstUBound = 0;
long lSecondLBound = 0;
long lSecondUBound = 0;
olesaWrite.GetLBound(1, &lFirstLBound);
olesaWrite.GetUBound(1, &lFirstUBound);
olesaWrite.GetLBound(2, &lSecondLBound);
olesaWrite.GetUBound(2, &lSecondUBound);
for (long i = lFirstLBound; i <= lFirstUBound; i++)
{
index[0] = i ;
for (long j = lSecondLBound; j <= lSecondUBound; j++)
{
index[1] = j;
long lElement = str[j];
//CString lElement = ch;
olesaWrite.PutElement(index, &lElement);
}
}
/*把ColesaWritefeArray变量转换为VARIANT,并写入到Excel表格中*/
VARIANT varWrite = (VARIANT)olesaWrite;
range.put_Value2(varWrite);
这样能将输入的整形写入excel,当变成VT_BSTR报内存不足,求指导如何修改
------解决方案--------------------
可以通过另外一种写法,
CRange write_range = start_range.get_Offset(COleVariant((long)7),COleVariant((long)j)) ;
write_range.put_Value2((COleVariant)(str[j]));
C++使用VARIANT实现二维数组的操作、怎么使用COleSafeArray实现二维数组将字符串写入excel相关推荐
- 字符串存入xls matlab,数组 – MATLAB:将字符串写入Excel
问题出在xlswrite行中: xlswrite(filename,A,sheet) writes to the specified worksheet. 这意味着您正在使用xlswrite(file ...
- Python——二维数组遍历操作
一.遍历数组(操作Value) 1.使用二维列表遍历二维数组 python 创建List二维列表 lists = [[] for i in range(3)] # 创建的是多行三列的二维列表 for ...
- python生成二维码教程_使用Python生成个性二维码
任务目的 这一步会介绍通过Python中的MyQR包实现生成二维码的操作,包括生成普通二维码.带有静态图和动态图的二维码,同时也会对MyQR生成二维码的常用参数进行介绍说明. 任务步骤注:CVM适合用 ...
- 多维数据格式mdd结构与计算机配套系统,多维数据分析系统
多维数据分析是以数据库或数据仓库为基础的,其最终数据来自底层的数据库系统,多维数据分析更适合以数据仓库为基础的数据分析处理.这里结合生产领域中重要效率评价指标 OEE,研究如何用多维的思路和方法来分析 ...
- python 通过openpyxl来操作Excel文件(二 ):写入Excel文件
这篇文章讲python 通过openpyxl来写入Excel文件,不清楚python怎么读取Excel文件的小伙伴可以去看下我的另一篇文章 传送门https://blog.csdn.net/i_cof ...
- C++使用VARIANT实现二维数组的操作
VARIANT变量是COM组件之间互相通信的重要的参数变量之一,它可以容纳多种不同的类型,如short.long.double等,包括各类指针和数组.组件之间的互相调用是比较耗时的,尤其带当组件位于不 ...
- Python使用numpy函数vsplit垂直(行角度)拆分numpy数组(返回拆分后的numpy数组列表)实战:垂直拆分二维numpy数组、split函数垂直拆分二维numpy数组
Python使用numpy函数vsplit垂直(行角度)拆分numpy数组(返回拆分后的numpy数组列表)实战:垂直拆分二维numpy数组.split函数垂直拆分二维numpy数组 目录
- C# 指定格式的字符串截成一维数组(二维数组)的操作类
指定格式的字符串截成一维数组(二维数组)的操作类 做项目时经常会遇到将"1,3,a,b,d"截成一维数组或将"1,a;2,b;3,c;4,d"截成二维数组.虽然 ...
- 【C 语言】二级指针内存模型 ( 指针数组 | 二维数组 | 自定义二级指针 | 将 一、二 模型数据拷贝到 三 模型中 并 排序 )
文章目录 一.指针数组 和 二维数组 数据 拷贝到 自定义二级指针 中 1.函数形参 设计规则 2.三种内存模型 对应 函数形参 指针退化规则 二.完整代码示例 一.指针数组 和 二维数组 数据 拷贝 ...
最新文章
- 一文看懂深度学习发展史和常见26个模型
- 和为s的连续正数序列
- Django 07模型层—单表操作(增删改查)
- @autowired注入mapper_Intellij IDEA中Mybatis Mapper自动注入警告的6种解决方案
- html5 svg 拖拽,SVG拖动
- 五十八、Java8的新特性Lambda表达式
- VGA timing information
- C语言源代码展示:常用转换函数实现原理
- ios10中禁止Safari浏览器用户缩放页面
- java的字符定义_Java字符串定义及常用方法
- MySql索引分析及查询优化
- 纳德拉:微软正计划“终极移动设备”
- java 自定义泛型方法_Java中自定义泛型方法的使用
- c++中虚基类表和虚函数表的布局
- 中石油 所罗门的宝藏
- es文件创建局域网服务器,es文件浏览器局域网连接win10电脑怎么设置
- flask上传图片解决方案
- 李沐动手学深度学习V2-NLP文本预处理和代码实现
- Java 获取主机ip地址(ipv4)
- Java入门之顺序、选择、循环结构