LabWindowsCVI中调用Excel

合集下载

LabwindowsCVI调用外部DLL文件的问题

LabwindowsCVI调用外部DLL文件的问题
panelHandle = 0;
}
}
这样的目的是:在外部调用的时候,便于调用。
C源文件编写完整后,把相关的*.uir文件添加到工程中,然后编写一个*.h文件,命名为exampledll.h,里面包含一个源文件中的函数申明。定义如下:
externint InitUIForDLL (void);//调用面板的函数
InitUIForDLL ();
return 0;
}
(2)通过一个按键来调用dll,即在一个工程中通过一个按钮来调取dll中的函数,来完成此按扭的功能。
与用c源代码来调用的方式一样,只是此工程已经有*.uir对象面板,在*.uir的面板上添加一个按钮,为按钮生成一个函数,在函数中调用外部dll中的函数。在编译前,要将*.lib和*.dll文件和头文件包含在工程中,并且将dll中的函数用一个*.h头文件包含:
int __stdcall DllEntryPoint (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
这两个函数是DLL动态链接库必须包含的两个函数,函数的具体内容为:
#include <cvirte.h>
int __stdcall DllMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
#include "CFI.h"
static int panelHandle;
int main (int argc, char *argv[])
{
if (InitCVIRTE (0, argv, 0) == 0)
return -1;/* out of memory */

LabWindows_CVI下基于Excel的测试控制技术_吴松龄

LabWindows_CVI下基于Excel的测试控制技术_吴松龄

ULL,MyCellRangeV,CA_DEFAULT_VAL,
&ExcelRangeHandle);
CA_VariantClear(&MyCellRangeV);
// Make range Active
Excel_RangeActivate (ExcelRangeHandle,
&ErrorInfo, NULL);
2 工程实现 2.1 软件总体设计 基于虚拟仪器的测控程序设计采用面向对象的 程序设计思想。在虚拟仪器系统中,硬件只是为了 解决信号的输入输出,软件才是整个仪器系统的关 键,任何一个使用者都可以通过修改软件的方法, 很方便地改变、增减系统的功能与规模,所以有 “软件就是仪器”之说。一般虚拟仪器系统包含用 户界面、程序控制、数据采集以及数据分析[4]。 整个软件设计过程中采用面向对象的程序设计 思想和模块化的程序结构,实现了数据处理和测试 流程分离。数据信息包括测试配置参数和测试结果 数据,测试流程的执行就是读取Excel文件中的配置 数据,配置测试仪器,进行相应的测试控制、数据 采集、分析和计算,并把结果回送到测试结果中。 整个软件主要包括测试系统主程序模块、单项测试 模块、测试流程数据库等部分,软件层次架构图如 图1所示。 在进入测试项目时,首先读取相应Excel文件的 内容,将测试流程和相关参数显示到测试界面的流 程表中,每执行一步流程,主动获取控制参数,执 行完毕后将测试的结果再写入到流程表中,全部流 程结束后将测试结果保存为Excel格式的结果文件。 图1 软件层次架构图(参见右栏)
// Get Active Workbook Sheets Excel_GetProperty(ExcelAppHandle,NULL,
E x c e l _ A p p S h e e t s , C AV T _ O B J H A N D L E , &ExcelSheetsHandle);

Visual Basic调用Excel之技巧

Visual Basic调用Excel之技巧

]Visual Basic调用Excel之技巧Visual Basic(以下简称VB)是一套可视化、面向对象、事件驱动方式的结构化程序设计语言,已经成为许多程序设计者甚至专业程序员用来开发WINDOWS应用程序的首选开发工具。

但用过VB的程序设计人员都知道,要想用VB输出复杂的表格来,是十分困难的。

能不能用VB调用EXCEL呢?Active 技术标准为我们解决了这个问题。

最近笔者为单位开发“土工试验数据整理”的某个模块时,涉及到复杂数据表格的输出问题,经过笔者的摸索,用VB调用EXCEL,取得了很好的效果。

本文从编程实践的角度对使用VB控制EXCEL的技术作简要说明。

1 EXCEL的对象模型如果一个应用程序支持自动化技术,那么其它的应用就可以通过其暴露的对象,对它进行控制,控制程序称为客户机,而被控制的一方就称为服务器,被控制的对象就是Active对象。

VB正是通过EXCEL显露的各级对象来控制EXCEL工作的。

每个对象都有各自的方法和属性,通过方法可以实现对对象的控制,而属性则可以改变对象的各种状态。

理解EXCEL的对象模型是对其编程的基础。

EXCEL是以层次结构组织对象的,其对象模型中含有许多不同的对象元素,这些对象元素就是VB可以操纵的。

在EXCEL对象的层次结构中,最顶层是Application对象,是Excel本身。

从该对象开始往下依次是:.workbooks对象集,是Application对象的下层,其指的是Excel的工作簿文件。

.worksheets对象集,是Workbooks对象集的下层,它表示的是Excel的一个工作表。

.Cells和Range对象,它们是worksheets对象的下层,它则指向Excel工作表中的一个或多个单元格。

以上介绍的四个对象是Excel中最重要也是用得最多的对象,而且从上面的介绍中也不难看出,要控制Excel中的某个具体对象,如某个工作簿中某一表格中的单元格,就必须从Excel层次结构对象的最上层即Application对象开始遍历。

005.在LabwindowsCVI中调用Excel的几种方法

005.在LabwindowsCVI中调用Excel的几种方法

最近需要实现在CVI中对Excel文件的读写,参考了几篇论文后,总结下基本上有3种方法:1.DDE(Dynamic Data Exchange);2.ADO(ActiveX Data Objects);3.Microsoft Excel xx.0 Object Library.DDE真是不知道那个角落里的东西,从传说中的Windows 3.x开始就有,直到最新版的Excel还支持这种方法。

资料少的可怜,MSDN上有两篇关于用DDE调用Excel的文章。

根据我的测试,这方法首先是用无论哪种方式打开Excel主程序,然后再对Excel进行连接,连接后通过通用的DDE函数进行数据传递。

我写的程序没有成功,主要在连接的时候经常连接失败,最后在打开Excel程序后加了很多延迟,问题好了很多,但有时候还是莫名其妙的连接失败。

在Excel的写入和读取上,尽管我已经把程序写的和一篇论文很像,但总是出现同一个错误,折腾了几下就放弃这种方法了。

鉴于DDE是接近淘汰的技术,其连接也不可靠,所以不建议使用这种方法。

Microsoft Excel xx.0 ObjectLibrary貌似资料很多,但是鉴于CVI的用户数量,还是别指望太多,MSDN上有VB和C#的实例,如果我没记错的话.至于CVI中的库,真不知道是谁写的,哪都找不到帮助,MSDN上有完整的VB下的手册可以参考,如果装过完整版的Office的话好像会有个中文版的。

用这东西真叫一个烦,大部分函数得看着VB 下的手册猜着怎么用,步骤很繁琐。

用它好处是,几乎可以实现Excel 的所有功能,操作顺序跟实际操作Excel有点像,缺点除了编程繁琐外,就是其版本严格的一一对应,Microsoft Excel 11.0 ObjectLibrary对应的就是Excel 2003,版本高了、低了都不行,甚至有同版本不同Service Pack都不能兼容的情况。

ADO+微软的Jet,可以实现把Excel映射成数据库,用SQL语言来操作Excel。

微软Excel的报表生成与LabWindows CVI的

微软Excel的报表生成与LabWindows CVI的

微软Excel的报表生成与LabWindows / CVI的概观关于微软的Excel报表生成使用LabWindows / CVI的Excel报表库本文会谈。

在LabWindows / CVI的这个库的船舶,并简化了创建专业外观与LabWindows / CVI 的Excel报表的过程。

目录1.启动Microsoft Excel中2.写入数据到Microsoft Excel文件使用Excel报告3.添加到Microsoft Excel的图表报告Microsoft Excel是一个用于显示和可视化数据集伟大的工具。

它提供了能够使用工作表和组织数据显示和分析通过自定义的图表数据。

这些功能和许多其他使Excel作为报表工具受欢迎。

结合Excel的报表功能的分析和LabWindows / CVI的数据采集库提供了一个强大的组合。

本文将讨论如何操作Microsoft Excel中使用的LabWindows / CVI的Excel报表生成的专业图书馆,看报告。

它不会覆盖所有不同的Excel功能或全部的职能,在LabWindows /简历库可用Excel报告。

其目的是介绍Excel报表库和函数库中可用来简化与创建Excel报表的过程。

介绍到Excel报告库微软Excel提供了一种方法为开发人员通过编程控制的ActiveX接口的所有功能。

使用此ActiveX界面要求用户必须使用Excel和ActiveX自动化类层次熟悉。

这也要求用户必须使用ActiveX自动化熟悉。

为了简化开发,LabWindows / CVI的报告提供了一个Excel的库,简化了通过其自动化的ActiveX接口Excel 的过程。

该库提供了更高层次的功能,以简化数据写入Excel和使用该数据来创建图表的过程,但如果你需要在你的Excel报表更多的自定义,您将需要使用Excel的ActiveX接口直接。

我们将不使用本文件讨论了Excel的ActiveX对象库直接。

Visual Baisc 6.0操作Excel2003-最全使用说明

Visual Baisc 6.0操作Excel2003-最全使用说明

预备知识和操作在VB中要想调用Excel,需要打开VB编程环境“工程”菜单中的“引用”项目,并选取项目中的“Microsoft Excel 11.0 object library”项。

由于你的Excel版本不同,所以这个选项的版本号也是不同的。

因为EXCEL是以层次结构组织对象的,其对象模型中含有许多不同的对象元素。

第一层:Application对象,即Excel本身;第二层:workbooks对象集,指Excel的工作簿文件第三层:worksheets对象集,表示的是Excel的一个工作表;第四层:Cells和Range对象,指向Excel工作表中的单元格。

1从"工程"菜单中选择"引用"栏;选择Microsoft Excel 11.0 Object Library(EXCEL2003),然后选择" 确定"。

2关键代码Dim newxls As Excel.ApplicationDim newbook As Excel.WorkbookDim newsheet As Excel.WorksheetSet newxls=CreatObject("Excel.Application")Set newbook=newxls.Worksbooks.AddSet newsheet=newbook.Worksheets(1)newxls.Visible = True '这一句很关键,编程语言中show和visible应该还起初始化的作用。

newxls.Workbooks.Open FileName:=App.Path & "备件库存查询" + mydate + ".xls"3 newxls.Visible := True '显示当前窗口4 newxls.Caption := "应用程序调用Microsoft Excel" '更改Excel 标题栏5 newxls.Workbooks.Add '添加新工作簿6 newxls.Workbooks.Open("C:\Excel\Demo.xls") '打开已存在的工作簿newxls.Workbooks.Open FileName:=App.Path & "备件库存查询" + mydate + ".xls"7 newxls.WorkSheets[2].Activate '设置第2个工作表为活动工作表newxls.WorkSheets["Sheet2"].Activate8 newxls.Cells[1,4].Value := "第一行第四列" '给单元格赋值newsheet.Cells(1, 4) = "备件名称"9 newxls.ActiveSheet.Columns[1].ColumnsWidth := 5'设置指定列的宽度单位:字符个数以第一列为例10 newxls.ActiveSheet.Rows[2].RowHeight := 1/0.035; // 1厘米设置指定行的高度,单位为磅,1磅=0.035厘米,以第二行为例11 在第8行之前插入分页符newxls.WorkSheets[1].Rows[8].PageBreak := 1在第4列之前删除分页符newxls.ActiveSheet.Columns[4].PageBreak := 012 关键代码Visual Basic6.0在excel中的range方法Sub Random()Dim myRange As RangeSet myRange = Worksheets("Sheet1").Range("A1:D5") '注意区域Range为二四象限对角线区域myRange.Formula = "=RAND()"myRange.Font.Bold = TrueEnd Sub13 关键代码Row = ActiveSheet.Range("A1:A679").Find("1-101").Row如果找不到1-101会崩溃Dim c As RangeSet c=ActiveSheet.Range("A1:A679").Find("1-101")If Not c Is Nothing Then '找到Set Row=c.RowElse '找不到'加入自已要处理的语句End If14 newxls.ActiveSheet.Range["B3:D4"].Borders[2].Weight := 3 '指定边框线宽度1-左2-右3-顶4-底5-斜( \ ) 6-斜( / )15 newxls.ActiveSheet.Cells[1,4].ClearContents '清除第一行第四列单元格公式16 newxls.ActiveSheet.Rows[1] := '隶书' '设置第一行字体属性:newxls.ActiveSheet.Rows[1].Font.Color := clBluenewxls.ActiveSheet.Rows[1].Font.Bold := Truenewxls.ActiveSheet.Rows[1].Font.UnderLine := True17 进行页面设置a.页眉newxls.ActiveSheet.PageSetup.CenterHeader := "报表演示"b.页脚newxls.ActiveSheet.PageSetup.CenterFooter := "第&P页"c.页眉到顶端边距2cm:newxls.ActiveSheet.PageSetup.HeaderMargin := 2/0.035d.页脚到底端边距3cm:newxls.ActiveSheet.PageSetup.HeaderMargin := 3/0.035e.顶边距2cm:newxls.ActiveSheet.PageSetup.TopMargin := 2/0.035f.底边距2cm:newxls.ActiveSheet.PageSetup.BottomMargin := 2/0.035g.左边距2cm:newxls.ActiveSheet.PageSetup.LeftMargin := 2/0.035h.右边距2cm:newxls.ActiveSheet.PageSetup.RightMargin := 2/0.035i.页面水平居中:newxls.ActiveSheet.PageSetup.CenterHorizontally := 2/0.035j.页面垂直居中:newxls.ActiveSheet.PageSetup.CenterV ertically := 2/0.035k.打印单元格网线:newxls.ActiveSheet.PageSetup.PrintGridLines := True '这一条要注意使用18 拷贝操作a.拷贝整个工作表:ed.Range.Copyb.拷贝指定区域:newxls.ActiveSheet.Range["A1:E2"].Copyc.从A1位置开始粘贴:newxls.ActiveSheet.Range.["A1"].PasteSpeciald.从文件尾部开始粘贴:newxls.ActiveSheet.Range.PasteSpecial19 插入一行或一列a. newxls.ActiveSheet.Rows[2].Insertb. newxls.ActiveSheet.Columns[1].Insert20 删除一行或一列a. newxls.ActiveSheet.Rows[2].Deleteb. newxls.ActiveSheet.Columns[1].Delete21 打印预览工作表newxls.ActiveSheet.PrintPreview '这一条要注意使用22 打印输出工作表newxls.ActiveSheet.PrintOut '这一条要注意使用23 工作表保存If not newxls.ActiveWorkBook.Saved thennewxls.ActiveSheet.PrintPreviewEnd if24 工作表另存为newxls.SaveAs("C:\Excel\Demo1.xls")25 存盘ExcelID.ActiveWorkBook.Saved := True26 关闭工作簿ExcelID.WorkBooks.Close27 退出ExcelExcelID.Quit28 设置工作表密码ExcelID.ActiveSheet.Protect "123", DrawingObjects:=True, Contents:=True, Scenarios:=True29 EXCEL的显示方式为最大化ExcelID.Application.WindowState = xlMaximized30 工作薄显示方式为最大化ExcelID.ActiveWindow.WindowState = xlMaximized31 设置打开默认工作薄数量ExcelID.SheetsInNewWorkbook = 332 关闭时是否提示保存(true 保存;false 不保存)ExcelID.DisplayAlerts = False33 设置拆分窗口,及固定行位置ExcelID.ActiveWindow.SplitRow = 1ExcelID.ActiveWindow.FreezePanes = True34 设置打印时固定打印内容ExcelID.ActiveSheet.PageSetup.PrintTitleRows = "$1:$1"35 设置打印标题ExcelID.ActiveSheet.PageSetup.PrintTitleColumns = ""36 设置显示方式(分页方式显示)ExcelID.ActiveWindow.View = xlPageBreakPreview37 设置显示比例ExcelID.ActiveWindow.Zoom = 10038 让Excel 响应DDE 请求Ex.Application.IgnoreRemoteRequests = False编程例子用VB操作EXCELPrivate Sub Command3_Click()On Error GoTo err1Dim i As LongDim j As LongDim objExl As Excel.Application '声明对象变量Me.MousePointer = 11 '改变鼠标样式Set objExl = New Excel.Application '初始化对象变量objExl.SheetsInNewWorkbook = 1 '将新建的工作薄数量设为1objExl.Workbooks.Add '增加一个工作薄objExl.Sheets(1).Name = "book2" '修改工作薄名称objExl.Sheets("book2").Select '选中工作薄<book2>For i = 1 To 50 '循环写入数据For j = 1 To 5If i = 1 ThenobjExl.Selection.NumberFormatLocal = "@" '设置格式为文本objExl.Cells(i, j) = " E " & i & jElseobjExl.Cells(i, j) = i & jEnd IfNextNextobjExl.Rows("1:1").Select '选中第一行objExl.Selection.Font.Bold = True '设为粗体objExl.Selection.Font.Size = 24 '设置字体大小objExl.Cells.EntireColumn.AutoFit '自动调整列宽objExl.ActiveWindow.SplitRow = 1 '拆分第一行objExl.ActiveWindow.SplitColumn = 7 '拆分前七列objExl.ActiveWindow.FreezePanes = True '固定拆分objExl.ActiveSheet.PageSetup.PrintTitleRows = "$1:$1" '设置打印固定行objExl.ActiveSheet.PageSetup.PrintTitleColumns = "" '打印标题objExl.ActiveSheet.PageSetup.RightFooter = "打印时间: " & _Format(Now, "yyyy年mm月dd日hh:MM:ss")objExl.ActiveWindow.View = xlPageBreakPreview '设置显示方式objExl.ActiveWindow.Zoom = 100 '设置显示大小objExl.ActiveSheet.Protect "123", DrawingObjects:=True, _Contents:=True, Scenarios:=TrueobjExl.Application.IgnoreRemoteRequests = FalseobjExl.Visible = True '使EXCEL可见objExl.Application.WindowState = xlMaximized 'EXCEL的显示方式为最大化objExl.ActiveWindow.WindowState = xlMaximized '工作薄显示方式为最大化objExl.SheetsInNewWorkbook = 3 '将默认新工作薄数量改回3个Set objExl = Nothing '清除对象Me.MousePointer = 0 '修改鼠标Exit Suberr1:objExl.SheetsInNewWorkbook = 3objExl.DisplayAlerts = False '关闭时不提示保存objExl.Quit '关闭EXCELobjExl.DisplayAlerts = True '关闭时提示保存Set objExl = NothingMe.MousePointer = 0End Sub。

LabWindows/CVI中基于ActiveX技术的Excel访问

LabWindows/CVI中基于ActiveX技术的Excel访问

Ib n 0 sC I N t n nt met 司 的 软 件 产 品 , 丑 Wjdw, V 是 ao a I r n / il s u s公
指 向可用方 法列表 的指针组成 , 每个方 法有对应 的 I D号码 , 称
为 DSI 当获 得 某 方 法 的 DSI 之 后 , 可 以通 过 调用 IPD。 IPD 就
Ac e sng t c lBa e n tv X c o o y i b i o /CVI c si o Ex e s d o Ac i e Te hn l g n La W nd ws
CHEN n - ,L U a - n ,W ANG in mi Yi gl I F n mig i Ja - n
摘要 : 实际工程为背景 , 绍了在 I b no s C I 以 介 丑 widw / V 环境 下 , 于 A te 基 cvX技 术访 问 Mi oot xe 03的方法 , i c sfE cl 0 r 2 以及创建
自动 化 仪 器驱 动 器 的 方 法 。详 细 阐述 了访 问 E cl 体 函 数 的 使 用 方 法 , xe 具 实现 了对 E cl 访 问 。通 过 该 工 程 实例 , 明 xe 的 说
具。
E cl xe是一种 常用 、 方便 的数据记 录格式 , 需要记 录数据 在
的某些场合中 , E cl 以 xe 格式记 录的数据 便 于后 续查看 与处理 。
本文介绍了在 Lb n o sC I中利用 A t e aWidw/ V ci X技 术进行 E cl v xe
2 L b n o sC I A t e a Wid w/ V 对 cvX技术 的支持 i
( as eN vgt nlb , ol eo uo a o , abnE gneigU iesy H ri 5 0 1 C ia P si aiao a .C lg f tm tn H ri n ier nvri , abn10 0 , hn) v i e A i n t

LabCVI常见问题及解决方法

LabCVI常见问题及解决方法

LabCVI常见问题及解决方法1.使用CVI9.0调用由VC++6.0编写的DLL,该DLL在VC中调用是可以的,输出方式也是C语言的。

但是在CVI中调用该DLL时,总是提示missing prototype,如何解决?答:设置BUILD OPTION在options->Build optionsc language options中取消Require function prototypes的检测2.CVI中如何向设计好的word表格中添加文字和数据?答:先在表格中需要添加文字和数据的地方做一个“书签”,在CVI中打开该文档后,使用Word_GetProperty (currSelHandle, NULL, Word_SelectionBookmarks, CA VT_OBJHANDLE, &rangeHandle);获得“书签”信息,然后再向该“书签”处添加文字。

3.CVI中如何将波形图控件的图片放到剪贴板中?答:首先使用GetCtrlDisplayBitmap (panel, FORCEPANEL_GRAPH, 1, &bitmap);获得波形图控件的图片,然后使用ClipboardPutBitmap (bitmap);将图片放入到剪贴板中。

4.CVI中是否支持指向函数的指针,如何实现?答:可以实现,如下例:int(*pmax)(int a, int b);int x,y,z;pmax=max;printf("input two numbers:\n");scanf("%d%d",&x,&y);z=(*pmax)(x,y);5.CVI中如何使用非NI公司的硬件产品?该公司提供了一个fp文件。

答:一般来说通常可以调用产品销售商提供的动态链接库,有些大公司也提供fp文件,该文件可以直接使用,就可以达到使用硬件的目的了。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

LabWindows/CVI中调用Excel设计要求:1.启动Microsoft Excel并打开xls文件;2.向xls文件中写入数据;3.根据所填入的数据完成画图功能;4.Xls具有存盘,关闭等功能;5.关闭Microsoft Excel。

利用ActiveX技术进行Excel访问。

ActiveX技术以微软的COM技术为基础,也称之为ActiveX自动化。

ActiveX是一种软件组件,它可以插入到不同的应用程序中,并被当作程序的一部分来使用。

利用ActiveX可以把两个或两个以上的应用程序组合在一起,使其像应用程序一样工作,或者可以在同一应用程序外壳中进行不同应用程序间的切换。

生成自动化仪器驱动器在LabWindows/CVI的工程主窗口中选择Tool/Create ActiveXController,弹出ActiveX Controller Wizard对话框,点击Next进入自动化服务器选择对话框,如图1所示。

选择Microsoft Excel 12.0 Object Library,点击Next进入服务器配置对话框,如图所示。

ActiveX Server 表示已选中的ActiveX服务器名称,Instnmmnt Prefix表示生成驱动器的前缀,可以设置为空或键人有效的C语言标识符,若不输入任何字符,系统会默认产生一个有效的文件名,一般情况下不用修改此属性。

Target.fp File表示CVI产生的.fp文件在磁盘中的存储路径,点击Browse可以查找或定位一个.fp文件。

将Add.fp File To Project选中表示允许把所产生的.fp文件加入当前工程中。

点击Compatibility Options进入兼容选项对话框,通过该对话框选项可以保持所产生的代码源文件与已经存在的ActiveX仪器驱动的向后兼容性,系统默认为Per Property。

点击Next进入高级选项对话框,在高级选项对话框中,点击Advanced Option 将显示高级函数配置对话框,可以通过此对话框来增减ActiveX对象及修改对象的名称和标识符,高级函数一般采用默认配置即可。

配置好高级函数之后,点击OK,返回到高级选项对话框,再点击Next按钮,系统会自动产生ActiveX所有驱动器文件,可以看到在左侧导航栏Instrument files中已经加入了驱动文件。

图l 自动化服务器选择对话框自动化服务器配置对话框自动化服务器面板附程序://---------------------------------------------------------------------------- #include <cviauto.h>#include <utility.h>#include <ansi_c.h>#include <userint.h>#include "toolbox.h"#include "exceldem.h"#include "excel97.h"#define caErrChk errChk#define APP_AUTOMATION_ERR "Error: Microsoft Excel Automation"#define APP_WARNING "Warning"#define EXCEL_ARRAY_OF_CELLS "A2:H11"#define ROWS 10#define COLUMNS 8#define LAUNCHERR "\An error occurred trying to launch Excel 97 through its automation interface.\n\n\ Ensure that Excel is installed and that you can launch it manually. If errors\n\ persist, try to launch Excel manually and use the CONNECT button instead."//---------------------------------------------------------------------------- // Variables//---------------------------------------------------------------------------- static int panelHandle = 0;static int excelLaunched = 0;static int appVisible = 1;static HRESULT status;static ExcelObj_App ExcelAppHandle = 0;static ExcelObj_Workbooks ExcelWorkbooksHandle = 0;static ExcelObj_Workbook ExcelWorkbookHandle = 0;static ExcelObj_Sheets ExcelSheetsHandle = 0;static ExcelObj_Worksheet ExcelWorksheetHandle = 0;static ExcelObj_Range ExcelRangeHandle = 0;static ExcelObj_ChartObject ExcelChartObjHandle = 0;static ExcelObj_Chart ExcelChartHandle = 0;static ExcelObj_ChartGroup ExcelChartsHandle = 0;static ERRORINFO ErrorInfo;static VARIANT MyVariant;static LPDISPATCH MyDispatch;static VARIANT MyCellRangeV;//---------------------------------------------------------------------------- // Prototypes//---------------------------------------------------------------------------- HRESULT ClearObjHandle(CAObjHandle *objHandle);static int ShutdownExcel(void);static void ReportAppAutomationError (HRESULT hr);static void InitVariables(void);static int UpdateUIRDimming(int panel);//---------------------------------------------------------------------------- // Main//---------------------------------------------------------------------------- int main (int argc, char *argv[]){if (InitCVIRTE (0, argv, 0) == 0)return -1;CA_InitActiveXThreadStyleForCurrentThread (0, COINIT_APARTMENTTHREADED);SetSleepPolicy (VAL_SLEEP_MORE);if ((panelHandle = LoadPanel (0, "exceldem.uir", PANEL)) < 0)return -1;// SetupUpdateUIRDimming(panelHandle);InitVariables();DisplayPanel (panelHandle);RunUserInterface ();// CleanupShutdownExcel();DiscardPanel (panelHandle);return 0;}//---------------------------------------------------------------------------- // InitVariables//---------------------------------------------------------------------------- static void InitVariables(void){// Demo path and filenameGetCtrlVal (panelHandle, PANEL_VISIBILITY, &appVisible);return;}//---------------------------------------------------------------------------- // UIR Callbacks//---------------------------------------------------------------------------- // LaunchApp//---------------------------------------------------------------------------- int CVICALLBACK LaunchApp (int panel, int control, int event,void *callbackData, int eventData1, int eventData2){HRESULT error = 0;switch (event) {case EVENT_COMMIT:// Launch AppSetWaitCursor (1);error = Excel_NewApp (NULL, 1, LOCALE_NEUTRAL, 0, &ExcelAppHandle);SetWaitCursor (0);if (error<0){MessagePopup (APP_AUTOMATION_ERR, LAUNCHERR);error = 0;goto Error;}// Make App Visibleerror = Excel_SetProperty (ExcelAppHandle, NULL, Excel_AppVisible, CAVT_BOOL, appVisible?VTRUE:VFALSE);if (error<0)goto Error;UpdateUIRDimming(panelHandle);MakeApplicationActive ();excelLaunched = 1;break;}Error:if (error < 0)ReportAppAutomationError (error);return 0;}//---------------------------------------------------------------------------- // ShutdownApp//---------------------------------------------------------------------------- int CVICALLBACK ShutdownApp (int panel, int control, int event,void *callbackData, int eventData1, int eventData2){switch (event) {case EVENT_COMMIT:SetWaitCursor (1);ShutdownExcel();SetWaitCursor (0);UpdateUIRDimming(panel);break;}return 0;}//---------------------------------------------------------------------------- // ShutdownExcel//---------------------------------------------------------------------------- static int ShutdownExcel(void){HRESULT error = 0;ClearObjHandle (&ExcelRangeHandle);ClearObjHandle (&ExcelWorksheetHandle);ClearObjHandle (&ExcelSheetsHandle);if (ExcelWorkbookHandle){// Close workbook without savingerror = Excel_WorkbookClose (ExcelWorkbookHandle, NULL, CA_VariantBool (VFALSE),CA_DEFAULT_VAL, CA_VariantBool (VFALSE));if (error < 0)goto Error;ClearObjHandle (&ExcelWorkbookHandle);}ClearObjHandle (&ExcelWorkbooksHandle);if (ExcelAppHandle){if (excelLaunched){// Quit the Applicationerror = Excel_AppQuit (ExcelAppHandle, &ErrorInfo);if (error < 0) goto Error;}ClearObjHandle (&ExcelAppHandle);}return 0;Error:if (error < 0)ReportAppAutomationError (error);return error;}//----------------------------------------------------------------------------// ChangeVisibility//----------------------------------------------------------------------------int CVICALLBACK ChangeVisibility (int panel, int control, int event,void *callbackData, int eventData1, int eventData2){HRESULT error = 0;switch (event) {case EVENT_COMMIT:GetCtrlVal(panel, control, &appVisible);if (ExcelAppHandle){error = Excel_SetProperty (ExcelAppHandle, NULL, Excel_AppVisible,CAVT_BOOL, appVisible?VTRUE:VFALSE);if (error < 0)ReportAppAutomationError (error);}break;}return 0;}//---------------------------------------------------------------------------- // OpenAppFile//----------------------------------------------------------------------------int CVICALLBACK OpenAppFile (int panel, int control, int event,void *callbackData, int eventData1, int eventData2){HRESULT error = 0;char fileName[MAX_PATHNAME_LEN];switch (event) {case EVENT_COMMIT:if (!ExcelWorkbooksHandle){// Get Workbookserror = Excel_GetProperty (ExcelAppHandle, NULL, Excel_AppWorkbooks,CAVT_OBJHANDLE, &ExcelWorkbooksHandle);if (error<0)goto Error;// Open existing WorkbookGetProjectDir (fileName);strcat(fileName, "\\exceldem.xls");error = Excel_WorkbooksOpen (ExcelWorkbooksHandle, NULL, fileName, CA_DEFAULT_VAL,CA_DEFAULT_VAL, CA_DEFAULT_VAL,CA_DEFAULT_VAL, CA_DEFAULT_VAL,CA_DEFAULT_VAL, CA_DEFAULT_VAL,CA_DEFAULT_VAL, CA_DEFAULT_VAL,CA_DEFAULT_VAL, CA_DEFAULT_VAL,CA_DEFAULT_VAL,&ExcelWorkbookHandle);if (error<0)goto Error;// Get Active Workbook Sheetserror = Excel_GetProperty (ExcelAppHandle, NULL, Excel_AppSheets, CAVT_OBJHANDLE, &ExcelSheetsHandle);if (error<0)goto Error;// Get First Sheeterror = Excel_SheetsItem (ExcelSheetsHandle, NULL, CA_VariantInt(1),&ExcelWorksheetHandle);if (error<0)goto Error;// Make First Sheet Active - should already be activeerror = Excel_WorksheetActivate (ExcelWorksheetHandle, NULL);if (error<0)goto Error;// Update UIRUpdateUIRDimming(panel);}elseMessagePopup(APP_WARNING, "Document already open");break;}return 0;Error:ClearObjHandle (&ExcelWorksheetHandle);ClearObjHandle (&ExcelSheetsHandle);ClearObjHandle (&ExcelWorkbookHandle);ClearObjHandle (&ExcelWorkbooksHandle);if (error < 0)ReportAppAutomationError (error);return 0;}//---------------------------------------------------------------------------- // SaveAppFile//---------------------------------------------------------------------------- int CVICALLBACK SaveAppFile (int panel, int control, int event,void *callbackData, int eventData1, int eventData2){HRESULT error = 0;char fileName[MAX_PATHNAME_LEN];switch (event) {case EVENT_COMMIT:if (ExcelWorkbookHandle){GetProjectDir (fileName);if (FileSelectPopup (fileName, "*.xls", "*.xls","Save file as...", VAL_SAVE_BUTTON, 0, 1, 1, 1, fileName)>0){SetWaitCursor (1);error = CA_VariantSetCString(&MyVariant, fileName);error = Excel_WorkbookSaveAs (ExcelWorkbookHandle, NULL, MyVariant,CA_DEFAULT_VAL,CA_DEFAULT_VAL,CA_DEFAULT_VAL,CA_DEFAULT_VAL,CA_DEFAULT_VAL,ExcelConst_xlNoChange,CA_DEFAULT_VAL,CA_DEFAULT_VAL,CA_DEFAULT_VAL,CA_DEFAULT_VAL);CA_VariantClear(&MyVariant);SetWaitCursor (0);if (error < 0)goto Error;}}break;}return 0;Error:if (error < 0)ReportAppAutomationError (error);return 0;}//---------------------------------------------------------------------------- // CloseAppFile//---------------------------------------------------------------------------- int CVICALLBACK CloseAppFile (int panel, int control, int event,void *callbackData, int eventData1, int eventData2){HRESULT error = 0;switch (event) {case EVENT_COMMIT:if (ExcelWorkbookHandle){ClearObjHandle (&ExcelRangeHandle);ClearObjHandle (&ExcelSheetsHandle);ClearObjHandle (&ExcelWorksheetHandle);if (ExcelWorkbookHandle){// Close workbook without savingerror = Excel_WorkbookClose (ExcelWorkbookHandle, NULL, CA_VariantBool (VFALSE),CA_DEFAULT_VAL, CA_VariantBool (VFALSE));if (error < 0)goto Error;ClearObjHandle (&ExcelWorkbookHandle);}ClearObjHandle (&ExcelWorkbooksHandle);ExcelWorksheetHandle = 0;UpdateUIRDimming(panel);}break;}return 0;Error:if (error < 0)ReportAppAutomationError (error);return 0;}//---------------------------------------------------------------------------- // WriteDataToExcel//---------------------------------------------------------------------------- // This function illustrates 3 different ways of writing data to the Excel cells. //---------------------------------------------------------------------------- HRESULT WriteDataToExcel(void){VARIANT *vArray = NULL;LPSAFEARRAY MySafeArray = NULL;HRESULT error = 0;int i, j;SetWaitCursor (1);// Open new Range for Worksheeterror = CA_VariantSetCString (&MyCellRangeV, EXCEL_ARRAY_OF_CELLS);error = Excel_WorksheetRange (ExcelWorksheetHandle, NULL, MyCellRangeV, CA_DEFAULT_VAL, &ExcelRangeHandle);if (error<0) goto Error;// Make range Activeerror = Excel_RangeActivate (ExcelRangeHandle, &ErrorInfo);if (error<0) goto Error;//----------------------------------------------------------------// 1) Set all cells in Range to a single value of zero//----------------------------------------------------------------error = Excel_SetProperty (ExcelRangeHandle, &ErrorInfo, Excel_RangeValue2, CAVT_VARIANT, CA_VariantFloat (0.0));if (error<0) goto Error;//----------------------------------------------------------------// 2) Set each cell in Range one at a time using an offset from// range's top left cell//----------------------------------------------------------------for (i=0;i<ROWS;i++){for (j=0;j<COLUMNS;j++){error = Excel_RangeSetItem (ExcelRangeHandle, &ErrorInfo, CA_VariantInt (i+1), CA_VariantInt (j+1), CA_VariantFloat ( sin(3.14*(i+1)/(ROWS+1)) * sin(3.14*(j+1)/(COLUMNS+1))) );if (error<0) goto Error;}}//----------------------------------------------------------------// 3) Set all cells at once using a SAFEARRAY in a VARIANT// NOTE: The arrays must be 2-dimensional even if setting only// one row or one column.//----------------------------------------------------------------// Create a Variant Array and set each valuevArray = (VARIANT *) calloc (ROWS*COLUMNS, sizeof(VARIANT));if (!vArray)goto Error;for (i=0;i<ROWS;i++){for (j=0;j<COLUMNS;j++){error = CA_VariantSetDouble (&vArray[i*COLUMNS+j], sin(3.14*(i+1)/(ROWS+1)) * sin(3.14*(j+1)/(COLUMNS+1)));if (error<0) goto Error;}}// Create a SAFEARRAYerror = CA_Array2DToSafeArray (vArray, CAVT_VARIANT, ROWS, COLUMNS, &MySafeArray);if (error<0) goto Error;// Set SafeArray into a Variant to send to Excelerror = CA_VariantSetSafeArray (&MyVariant, CAVT_VARIANT, MySafeArray);if (error<0) goto Error;// Set Range with one call passing SAFEARRAY as Varianterror = Excel_SetProperty (ExcelRangeHandle, &ErrorInfo, Excel_RangeValue2, CAVT_VARIANT, MyVariant);if (error<0) goto Error;Error:SetWaitCursor (0);// Free array of VARIANTif (vArray){for (i=0;i<ROWS;i++){for (j=0;j<COLUMNS;j++){CA_VariantClear (&vArray[i*COLUMNS+j]);}}free(vArray);}// Free SAFEARRAY in VARIANTCA_VariantClear(&MyVariant);CA_VariantClear(&MyCellRangeV);// Clear Range HandleClearObjHandle (&ExcelRangeHandle);if (error < 0)ReportAppAutomationError (error);return error;}int CVICALLBACK WriteData (int panel, int control, int event,void *callbackData, int eventData1, int eventData2){switch (event){case EVENT_COMMIT:WriteDataToExcel();break;}return 0;}//---------------------------------------------------------------------------- // MakeChartInExcel//---------------------------------------------------------------------------- HRESULT MakeChartInExcel(void){HRESULT error = 0;SetWaitCursor (1);// Open new Range for Worksheeterror = CA_VariantSetCString (&MyCellRangeV, EXCEL_ARRAY_OF_CELLS);error = Excel_WorksheetRange (ExcelWorksheetHandle, NULL, MyCellRangeV, CA_DEFAULT_VAL, &ExcelRangeHandle);CA_VariantClear(&MyCellRangeV);if (error<0) goto Error;// Open new Chart Collection for Worksheetstatus = Excel_WorksheetChartObjects (ExcelWorksheetHandle, NULL, CA_DEFAULT_VAL, &ExcelChartsHandle);if (status<0) goto Error;// Create new chartstatus = Excel_ChartObjectsAdd (ExcelChartsHandle, NULL, 175.0, 175.0,300.0, 200.0, &ExcelChartObjHandle);if (status<0) goto Error;status = Excel_GetProperty (ExcelChartObjHandle, NULL, Excel_ChartObjectChart, CAVT_OBJHANDLE, &ExcelChartHandle);if (status<0) goto Error;// Use Chart Wizard to setup Chartstatus = CA_VariantSetCString (&MyVariant, "Chart #1");status = CA_GetDispatchFromObjHandle (ExcelRangeHandle, &MyDispatch); // Get dispatch for rangestatus = Excel_ChartChartWizard (ExcelChartHandle, &ErrorInfo,CA_VariantDispatch (MyDispatch),CA_VariantLong(ExcelConst_xl3DSurface),CA_DEFAULT_VAL,CA_VariantInt(ExcelConst_xlRows),CA_DEFAULT_VAL,CA_DEFAULT_VAL,CA_DEFAULT_VAL,MyVariant,CA_DEFAULT_VAL,CA_DEFAULT_VAL,CA_DEFAULT_VAL);CA_VariantClear(&MyVariant);if (status<0) goto Error;// Lets get the current rotation valuestatus = Excel_GetProperty (ExcelChartHandle, NULL, Excel_ChartRotation, CAVT_VARIANT, &MyVariant);if (status<0) goto Error;CA_VariantClear(&MyVariant);Error:SetWaitCursor (0);CA_VariantClear(&MyCellRangeV);CA_VariantClear(&MyVariant);ClearObjHandle (&ExcelRangeHandle);ClearObjHandle (&ExcelChartHandle);ClearObjHandle (&ExcelChartObjHandle);ClearObjHandle (&ExcelChartsHandle);if (error < 0)ReportAppAutomationError (error);return error;}int CVICALLBACK MakeChart (int panel, int control, int event,void *callbackData, int eventData1, int eventData2){switch (event){case EVENT_COMMIT:MakeChartInExcel();break;}return 0;}//---------------------------------------------------------------------------- // RunMacro//---------------------------------------------------------------------------- int CVICALLBACK RunMacro (int panel, int control, int event,void *callbackData, int eventData1, int eventData2){HRESULT error = 0;switch (event){case EVENT_COMMIT:SetWaitCursor (1);// Application.Run "exceldem.xls!NewDataFromMacro"status = CA_VariantSetCString (&MyVariant, "exceldem.xls!NewDataFromMacro");error = Excel_AppRun (ExcelAppHandle, NULL, MyVariant, CA_DEFAULT_VAL, CA_DEFAULT_VAL, CA_DEFAULT_VAL, CA_DEFAULT_VAL,CA_DEFAULT_VAL, CA_DEFAULT_VAL, CA_DEFAULT_VAL,CA_DEFAULT_VAL, CA_DEFAULT_VAL,CA_DEFAULT_VAL,CA_DEFAULT_VAL, CA_DEFAULT_VAL, CA_DEFAULT_VAL,CA_DEFAULT_VAL, CA_DEFAULT_VAL, CA_DEFAULT_VAL,CA_DEFAULT_VAL, CA_DEFAULT_VAL, CA_DEFAULT_VAL,CA_DEFAULT_VAL, CA_DEFAULT_VAL, CA_DEFAULT_VAL,CA_DEFAULT_VAL, CA_DEFAULT_VAL, CA_DEFAULT_VAL,CA_DEFAULT_VAL, CA_DEFAULT_VAL, CA_DEFAULT_VAL,CA_DEFAULT_VAL, CA_DEFAULT_VAL, NULL);CA_VariantClear(&MyVariant);if (status<0) goto Error;SetWaitCursor (0);break;}Error:SetWaitCursor (0);if (error < 0)ReportAppAutomationError (error);return 0;}//---------------------------------------------------------------------------- // Quit//---------------------------------------------------------------------------- int CVICALLBACK Quit (int panel, int control, int event,void *callbackData, int eventData1, int eventData2){switch (event) {case EVENT_COMMIT:QuitUserInterface (0);break;}return 0;}//----------------------------------------------------------------------------// UpdateUIRDimming//---------------------------------------------------------------------------- static int UpdateUIRDimming(int panel){SetCtrlAttribute (panel, PANEL_LAUNCHAPP, ATTR_DIMMED, (int)ExcelAppHandle);SetCtrlAttribute (panel, PANEL_SHUTDOWNAPP, ATTR_DIMMED, !(int)ExcelAppHandle);SetCtrlAttribute (panel, PANEL_OPENFILE, ATTR_DIMMED, ((int)ExcelWorksheetHandle || !(int)ExcelAppHandle));SetCtrlAttribute (panel, PANEL_SAVEFILE, ATTR_DIMMED, !(int)ExcelWorksheetHandle);SetCtrlAttribute (panel, PANEL_CLOSEFILE, ATTR_DIMMED, !(int)ExcelWorksheetHandle);SetCtrlAttribute (panel, PANEL_WRITEDATA, ATTR_DIMMED, !(int)ExcelWorksheetHandle);SetCtrlAttribute (panel, PANEL_MAKECHART, ATTR_DIMMED, !(int)ExcelWorksheetHandle);SetCtrlAttribute (panel, PANEL_RUNMACRO, ATTR_DIMMED, !(int)ExcelWorksheetHandle);return 0;}//----------------------------------------------------------------------------// ClearObjHandle//---------------------------------------------------------------------------- HRESULT ClearObjHandle(CAObjHandle *objHandle){HRESULT error = 0;if ((objHandle) && (*objHandle)){error = CA_DiscardObjHandle (*objHandle);*objHandle = 0;}return error;}//---------------------------------------------------------------------------- // ReportWordAutomationError//---------------------------------------------------------------------------- static void ReportAppAutomationError (HRESULT hr){char errorBuf[256];if (hr < 0) {CA_GetAutomationErrorString (hr, errorBuf, sizeof (errorBuf));MessagePopup (APP_AUTOMATION_ERR, errorBuf);}return;}。

相关文档
最新文档