配合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/

标签: C++, COM,VARIANT,SAFEARRAY,COleSafeArray

如何使用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相关推荐

  1. 字符串存入xls matlab,数组 – MATLAB:将字符串写入Excel

    问题出在xlswrite行中: xlswrite(filename,A,sheet) writes to the specified worksheet. 这意味着您正在使用xlswrite(file ...

  2. Python——二维数组遍历操作

    一.遍历数组(操作Value) 1.使用二维列表遍历二维数组 python 创建List二维列表 lists = [[] for i in range(3)] # 创建的是多行三列的二维列表 for ...

  3. python生成二维码教程_使用Python生成个性二维码

    任务目的 这一步会介绍通过Python中的MyQR包实现生成二维码的操作,包括生成普通二维码.带有静态图和动态图的二维码,同时也会对MyQR生成二维码的常用参数进行介绍说明. 任务步骤注:CVM适合用 ...

  4. 多维数据格式mdd结构与计算机配套系统,多维数据分析系统

    多维数据分析是以数据库或数据仓库为基础的,其最终数据来自底层的数据库系统,多维数据分析更适合以数据仓库为基础的数据分析处理.这里结合生产领域中重要效率评价指标 OEE,研究如何用多维的思路和方法来分析 ...

  5. python 通过openpyxl来操作Excel文件(二 ):写入Excel文件

    这篇文章讲python 通过openpyxl来写入Excel文件,不清楚python怎么读取Excel文件的小伙伴可以去看下我的另一篇文章 传送门https://blog.csdn.net/i_cof ...

  6. C++使用VARIANT实现二维数组的操作

    VARIANT变量是COM组件之间互相通信的重要的参数变量之一,它可以容纳多种不同的类型,如short.long.double等,包括各类指针和数组.组件之间的互相调用是比较耗时的,尤其带当组件位于不 ...

  7. Python使用numpy函数vsplit垂直(行角度)拆分numpy数组(返回拆分后的numpy数组列表)实战:垂直拆分二维numpy数组、split函数垂直拆分二维numpy数组

    Python使用numpy函数vsplit垂直(行角度)拆分numpy数组(返回拆分后的numpy数组列表)实战:垂直拆分二维numpy数组.split函数垂直拆分二维numpy数组 目录

  8. C# 指定格式的字符串截成一维数组(二维数组)的操作类

    指定格式的字符串截成一维数组(二维数组)的操作类 做项目时经常会遇到将"1,3,a,b,d"截成一维数组或将"1,a;2,b;3,c;4,d"截成二维数组.虽然 ...

  9. 【C 语言】二级指针内存模型 ( 指针数组 | 二维数组 | 自定义二级指针 | 将 一、二 模型数据拷贝到 三 模型中 并 排序 )

    文章目录 一.指针数组 和 二维数组 数据 拷贝到 自定义二级指针 中 1.函数形参 设计规则 2.三种内存模型 对应 函数形参 指针退化规则 二.完整代码示例 一.指针数组 和 二维数组 数据 拷贝 ...

最新文章

  1. 一文看懂深度学习发展史和常见26个模型
  2. 和为s的连续正数序列
  3. Django 07模型层—单表操作(增删改查)
  4. @autowired注入mapper_Intellij IDEA中Mybatis Mapper自动注入警告的6种解决方案
  5. html5 svg 拖拽,SVG拖动
  6. 五十八、Java8的新特性Lambda表达式
  7. VGA timing information
  8. C语言源代码展示:常用转换函数实现原理
  9. ios10中禁止Safari浏览器用户缩放页面
  10. java的字符定义_Java字符串定义及常用方法
  11. MySql索引分析及查询优化
  12. 纳德拉:微软正计划“终极移动设备”
  13. java 自定义泛型方法_Java中自定义泛型方法的使用
  14. c++中虚基类表和虚函数表的布局
  15. 中石油 所罗门的宝藏
  16. es文件创建局域网服务器,es文件浏览器局域网连接win10电脑怎么设置
  17. flask上传图片解决方案
  18. 李沐动手学深度学习V2-NLP文本预处理和代码实现
  19. Java 获取主机ip地址(ipv4)
  20. Java入门之顺序、选择、循环结构

热门文章

  1. python爬斗鱼直播_Python---20行代码爬取斗鱼平台房间数据(下)
  2. 自学网络安全|什么是网络安全
  3. 李耀于NOIP2010集训出的题 Dvalue
  4. 一文搞定十大经典排序算法
  5. 淘宝的估算并发量公式
  6. Android --- 一篇带你搞懂CTS
  7. 正点原子IMX6UL ADC采集
  8. 好程序员Python培训分享Python系列之分支结构
  9. centos 编译libevent_libevent CentOS7 编译
  10. 安装/卸载docker