VC++和 Excel 对象接口在传感器数据分析中的应用

发表时间:2021/4/16   来源:《科学与技术》2021年1月2期   作者:毛小玲 杨俊磊
[导读] Excel对象接口为外部软件或工具提供了一种操作Excel页面数据的方法
        毛小玲  杨俊磊
        中国飞行试验研究院  陕西 西安 710089
        摘要:Excel对象接口为外部软件或工具提供了一种操作Excel页面数据的方法。通过在VC++中访问Excel对象接口中的方法和属性,可以实现对传感器测量数据向Excel中的自动导入,并获取分析后结果数据,可有效解决单纯依靠Excel完成传感器测量数据精度筛选、特性匹配分析等带来的操作复杂、灵活度低、人机交互差等问题,极大提高了对传感器测量数据分析的工作效率。
        关键字:Excel对象接口;传感器;测量数据;精度分析;匹配分析;
中图分类号:TH863     文献标识码:A         文章编号:

        The Application of VC and Excel Object Interface in Sensor Data Analysis
MAO Xiaoling
 (Chinese Flight Test Establishment, Xi’an 710089, China)
Abstract: Excel object interface provides a method to operate Excel page data for external software or tools. Through accessing the methods and attributes of Excel object interface by VC++, the sensor measurement data can be automatically imported into the Excel ,  and the result data can be obtained after analysis. It can effectively solve the problems of complex operation, low flexibility and poor human-computer interaction caused by just simply relying on Excel to complete the precision and characteristic matching analysis of  sensor measurement data, and greatly improve the working efficiency of sensor measurement data analysis.
Keywords: Excel object interface, sensor,measurement data, accuracy analysis, matching analysis

1 引言
        对一般传感器而言,精度筛选一般利用Excel精度计算表即可完成,而对于多余度传感器而言,不仅仅需要对精度进行筛选,还要进行特性匹配,才能使得多余度传感器每个传感器输出的一致性达到要求。如单采用Excel表格来完成多余度传感器的特性匹配分析,则在复杂运算方面显得不足,使用也不够灵活,人机交互性差,如果需要进行匹配的数据点再增加,传感器的匹配选择将是一件非常耗时的工作。所以本文采用VC++和Excel相结合开发设计了传感器数据分析软件,充分利用了VC++和Excel两者的优点,提高了工作效率。
2 软件的总体结构
    传感器数据分析软件在结构上由三部分组成:数据读写、数据分析和结果存储,如图1所示。

图1 软件总体结构

数据读写模块主要完成VC++对Excel对象接口的调用,读取传感器测量值或向Excel计算表写入数据;数据分析模块主要完成对测量数据的精度分析和匹配分析,剔除不符合精度要求的测量组,找出每组的匹配信息。结果存储模块完成传感器数据分析结果的存储,包括每组的计算精度,匹配信息等。
为了充分利用Excel的数据处理功能,测量数据的精度分析采用预先设计好的Excel计算表完成的,其实现方法是软件将读取的测量值写入Excel计算表中,然后将结果单元中的数值读出,完成精度的计算。整个软件采用模块化设计思想,将各个功能模块进行了封装,便于以后程序的扩展与升级。
3 VC++调用Excel的实现方法
3.1 Excel对象模型及接口
利用VC++操作Excel表格前需要启动Excel应用程序(Application),然后获得当前激活的工作薄管理对象(Workbooks),通过工作薄管理对象添加工作薄对象(_Workbook),通过工作薄对象激活工作表管理对象(Worksheets),并添加工作表对象(_Worksheet),通过工作表对象获得选区(Range),利用选区获得工作表行列信息,并获取单元格内容,然后就可以对Excel表格进行读写操作了。图2为Excel对象模型的层次组织结构,Application对象处于模型的最顶层,代表了整个Excel应用程序。

图2  Excel对象模型的层次组织结构

在使用Excel各种对象前,需要向VC++导入Excel相关类,并在使用这些类之前需要对Com库进行初始化,具体操作步骤如下:
(1) 在VC++6.0环境中,通过ClassWizard打开类向导,在“Add Class…”选项下选择“From a type Library”,打开“Import from Type Library”窗口。
(2)在Office安装路径下,选择EXCEL.EXE文件,在打开的类选择对话框,依次选择_Application、Workbooks、_Workbook、Worksheets、_Worksheet和Range等类,单击“OK”完成Excel类的导入。
(3)在程序实例初始化时调用CoInitialize()对Com库进行初始化。
3.2 VC++操作Excel的方法
VC++操作Excel表格主要通过导入的Excel相关类的对象来完成,在各对象的方法实现中主要使用了COleVariant类,COleVariant是对Variant数据类型的封装,常用在OLE自动化中传递数据。以传感器数据分析模块部分代码为例,介绍VC++操作Excel的主要实现方法。代码中
Excelapp、m_books、m_book、m_sheets、m_sheets和m_range变量是按照Excel对象模型层次组织结构定义的类对象。
(1)创建Excel应用对象,并设置文档不可见和禁止弹出对话框
if(!Excelapp.CreateDispatch("Excel.Application"))
    {         
        DispInfo("错误:创建EXCEL服务失败!");
        return;
    }   
    Excelapp.SetVisible(false);                
    Excelapp.SetAlertBeforeOverwriting(false);   
    Excelapp.SetDisplayAlerts(false);
(2)获取精度计算的CALC工作表
m_books.AttachDispatch(Excelapp.GetWorkbooks());     
    lpDisp= m_books.Open(m_xls_path, vtMissing, vtMissing, vtMissing, vtMissing, vtMissing,
                        vtMissing, vtMissing, vtMissing, vtMissing, vtMissing,
                        vtMissing, vtMissing, vtMissing, vtMissing);
    m_book.AttachDispatch(lpDisp);
    m_sheets.AttachDispatch(m_book.GetWorksheets());
    m_sheet.AttachDispatch(m_sheets.GetItem(COleVariant("CALC ")));
(3)写入测量值,获取精度,并进行精度分析
    for(i=0; i<TotalRow; i++) 
    {         
        m_range.AttachDispatch(m_sheet.GetCells());
        for(j=0; j<TotalCol; j++)  
        {
          str=m_list_datadisp.GetItemText(i, j+1);
              m_range.SetItem(COleVariant((long)aexd),COleVariant((long)(j+2)),COleVariant(str));
        }
         m_book.Save();
m_range.AttachDispatch(m_range.GetItem(COleVariant((long)arow),
COleVariant((long)acol)).pdispVal);
        ar=(range.GetValue(temp)) .dblVal;
        double numr=atof(m_list_datadisp.GetItemText(i, 0));
        for(k=0; k<TotalRow; k++)
        {           
            if(floor(m_meet_recor[k].value[0])= = floor(numr))
            {
                m_meet_recor[k].accu_v=ar;
                if(accu_v<ar)
                    m_meet_recor[k].deleteflag=1;
                else
                    m_meet_recor[k].deleteflag=-1;           
                break;
            }
        }       
    }
(4)对符合精度要求的测量项进行比较运算,找出各测量组的匹配信息
    for(k=0;k<TotalRow;k++)
    {
        findMnum=0;       
        for(i=0;i<TotalRow;i++)
        {
            if(k!=i)
            {
                for(j=1;j<=totalcol;j++)
                {                   
                    cal_cmpvalue_org[j-1]=m_meet_recor[k].value[j]-m_meet_recor[i].value[j];         
                    if(fabs(cal_cmpvalue_org [j-1]) < cmp_value)                
                        find=true;
                    else
                    {
                        find=false;
break;
                    }                       
                }               
             }
            else
                continue;       
// 如果满足匹配条件,对差值进行排序,获取最大和最小差值   
            if(find= =true)
            {
                findMnum++;
                m_meet_recor[k].meetnum=findMnum;                 
                for(m=0;m<=totalcol-2;m++)         
        {
                    for(n=m+1;n<=totalcol-1;n++)
                    {
                        if(cal_cmpvalue_org[m]-cal_cmpvalue_org[n]>0)
                        {
                            cmp_temp=cal_cmpvalue_org[m];
                            cal_cmpvalue_org[m]=cal_cmpvalue_org[n];
                            cal_cmpvalue_org[n]=cmp_temp;
                        }
                    }
                }
            m_meet_recor[k].meetdata[findMnum-1][0]=(float)m_meet_recor[i].value[0];                    m_meet_recor[k].meetdata[findMnum-1][1]=cal_cmpvalue_org[0];
            m_meet_recor[k].meetdata[findMnum-1][2]=cal_cmpvalue_org[totalcol-1];
            }           
        }
        m_meet_recor[k].meetnum=findMnum;
    }
4 实际应用
传感器数据分析软件通过VC++调用Excel对象接口完成了传感器测量数据的读取、精度分析、匹配分析、显示和存储等功能。操作便捷,人机界面友好,图3和图4是实际应用效果。

图3 传感器数据分析软件主界面


图4  传感器数据分析结果报表

5结论
Excel是一种常用的数据管理程序,具有完整的数据处理功能,但是人机交互性差,在传感器数据分析方面,包括精度分析、匹配分析等,如果完全采用Excel去完成,将是一件非常耗时的工作,且容易出错。本设计利用VC++调用Excel对象接口完成传感器数据的分析,充分利用了两者的优点。传感器数据分析软件同时采用了模块化设计,便于以后功能的扩展与维护。整个软件操作简单,使用灵活,人机界面友好,节省了大量数据分析时间,提高了工作效率。

作者简介:毛小玲(1986.6-),女,四川人,本科,工程师,主要从事机载传感器设计。
投稿 打印文章 转寄朋友 留言编辑 收藏文章
  期刊推荐
1/1
转寄给朋友
朋友的昵称:
朋友的邮件地址:
您的昵称:
您的邮件地址:
邮件主题:
推荐理由:

写信给编辑
标题:
内容:
您的昵称:
您的邮件地址: