LabVIEW和LabWindows/CVI前面板界面中嵌入word等Office辦公軟件

? ? ? ?在使用office辦公軟件的過(guò)程中,有時(shí)為了使用方便,通常會(huì)將如word,excel等嵌入到程序界面中。LabVIEW與LabWindows/CVI中同樣支持這一功能,只需要提供相關(guān)的ActiveX插件就行。
? ? ? ? ActiveX控件基于COM服務(wù)器進(jìn)行操作,且與開(kāi)發(fā)平臺(tái)無(wú)關(guān),因此,在一種編程語(yǔ)言上開(kāi)發(fā)的ActiveX控件無(wú)需任何修改,就可在另一種編程語(yǔ)言中使用。由于其可重用性的特點(diǎn),目前,除操作系統(tǒng)本身提供的ActiveX控件外,在網(wǎng)絡(luò)資源上也能得到相當(dāng)多的ActiveX控件,可以幫助我們完成各種各樣的軟件開(kāi)發(fā)任務(wù)。
? ? ? ? 下面通過(guò)一個(gè)例子說(shuō)明在LabVIEW和LabWindows/CVI平臺(tái)中使用ActiveX控件編程的方法實(shí)現(xiàn)將如word,excel等嵌入到程序界面中。 需要的插件為:Edrawoffice Viewer ActiveX Control,Edraw office Viewer ActiveX Control不免費(fèi),使用介紹后總會(huì)彈出提示對(duì)話框,但不影響使用,當(dāng)然也可以自己在網(wǎng)上找免費(fèi)的資源。安裝步驟如下:
? ? ? ? ?1、??安裝Edraw OfficeViewer ActiveX Control,安裝完后在安裝路徑下找到redist文件夾,里面有32位和64位的officeviewer.ocx文件,其實(shí)我們需要的只是這個(gè)文件,即使電腦上不安裝Edraw Office Viewer ActiveX Control,只要注冊(cè)這個(gè)文件就可以了。
? ? ? ? ?2、??需要手動(dòng)注冊(cè)officeviewer.ocx文件,注冊(cè)方法如下:officeviewer.ocx下載放在目錄c:\windows\syswow64目錄下。CMD管理員運(yùn)行,命令行中輸入regsvr32 c:\Windows\SysWOW64\officeviewer.ocx(相應(yīng)控件名)
? ? ?3、??注冊(cè)之后打開(kāi)LabVIEW,在新建VI前面板中插入狀態(tài)欄控件的方法為,在前面板“ActiveX容器”控件的右鍵菜單中選擇“插入ActiveX對(duì)象...”命令,彈出“選擇ActiveX對(duì)象”對(duì)話框,選擇”Edraw OfficeViewer Component”,如圖1所示。此時(shí)前面板中ActiveX容器顯示如圖2所示;


? ? ? ?同樣在LabWindows/CVI中,注冊(cè)之后打開(kāi)LabWindows/CVI,在新建uir前面板中鼠標(biāo)右鍵快捷菜單選擇ActiveX…,右鍵插入ActiveX對(duì)象,找到”Edraw OfficeViewer Component”,添加到面板上。如圖3所示。此時(shí)前面板中ActiveX容器顯示如圖4所示;注意:在LabWindows/CVI中,需要引入引入了fp和.h文件 。步驟如下:右鍵菜單---》Generate ActiveX Control Driver創(chuàng)建控件驅(qū)動(dòng),也就是引入一堆操作頭文件,否則無(wú)法編碼操作。


LabVIEW前面板設(shè)計(jì)
? ? ? ?本例VI程序運(yùn)行前面板如圖所示,在前面板上中間位置調(diào)用了我們已經(jīng)注冊(cè)好的ActiveX控件——“Edraw OfficeViewer Component”,當(dāng)按下面板上的”打開(kāi)文件”按鈕,會(huì)彈出選擇文件對(duì)話框,選擇相應(yīng)的文件后,word文檔會(huì)顯示在界面上;當(dāng)我們?cè)诳丶?nèi)修改文件后,點(diǎn)擊”修改文件”按鈕后,源文件的內(nèi)容會(huì)被修改;點(diǎn)擊“退出”按鈕則退出程序。

LabVIEW程序框圖的代碼實(shí)現(xiàn)
? ? ? ?本例程序框圖使用了事件結(jié)構(gòu),在事件結(jié)構(gòu)中響應(yīng)前面板的所有命令按鈕的“值改變”事件。通過(guò)事件結(jié)構(gòu)我們可以實(shí)現(xiàn)我們所要求的功能。部分程序框圖如下:

? ? ? 首先說(shuō)明一下什么是屬性,屬性是指對(duì)象(如控件、VI或應(yīng)用程序等)的特性,相當(dāng)于C++類中的數(shù)據(jù)。具有“可讀”、“可寫(xiě)”或“可讀寫(xiě)”等操作方式。在程序框圖中的屬性節(jié)點(diǎn)函數(shù)上有一個(gè)小箭頭,若在左邊,表明該屬性可寫(xiě),若在右邊,表明該屬性可讀。對(duì)于可讀可寫(xiě)的屬性,右鍵單擊屬性節(jié)點(diǎn)中的某個(gè)屬性,可以在右鍵菜單中選擇“轉(zhuǎn)換為讀取”或“轉(zhuǎn)換為寫(xiě)入”,在兩者之間進(jìn)行切換。關(guān)于屬性節(jié)點(diǎn)的生成不在本文論述的范圍內(nèi)。
LabWindows/CVI前面板設(shè)計(jì)
? ? ? 本例程序運(yùn)行前面板如圖所示,在前面板上的中間位置調(diào)用了操作系統(tǒng)提供的ActiveX控件——“Edraw OfficeViewer Component”, 當(dāng)按下面板上的”生成報(bào)表”按鈕,會(huì)自動(dòng)生成報(bào)表;當(dāng)按下面板上的”閱讀報(bào)表”按鈕,word報(bào)表文檔會(huì)顯示在界面上;當(dāng)我們?cè)诳丶?nèi)修改文件后,點(diǎn)擊”修改報(bào)表”按鈕后,源文件的內(nèi)容會(huì)被修改;點(diǎn)擊“退出”按鈕則退出程序。

LabWindows/CVI程序的代碼實(shí)現(xiàn):

部分代碼如下:
#include <cvirte.h>?????????
#include <userint.h>
#include "wordreport.h"
#include "word.h"
#include <utility.h>
#include "report.h"
#include "officeviewer.h"
?
#define rowNum 1
static int panelHandle;
static CAObjHandle appHandle = 0;
static CAObjHandle docHandle = 0;
static CAObjHandle tablesHandle = 0;
static CAObjHandle columnsHandle=0;
static CAObjHandle borderHandle=0;
static CAObjHandle bordersHandle=0;
static CAObjHandle rowHandle=0,rowsHandle=0;
static CAObjHandle shadingHandle=0;
static CAObjHandle wordhandle=0;
?
char WordFileName[MAX_PATHNAME_LEN]={0};
?
int main (int argc, char *argv[])
{
???? if (InitCVIRTE (0, argv, 0) == 0)
??????????? return -1;?? /* out of memory */
???? if ((panelHandle = LoadPanel (0, "report.uir", PANEL)) < 0)
??????????? return -1;
???? DisplayPanel (panelHandle);
???? RunUserInterface ();
???? DiscardPanel (panelHandle);
???? return 0;
}
……
int CVICALLBACK Read (int panel, int control, int event,
???????????????????????????????? ? void *callbackData, int eventData1, int eventData2)
{
???? switch (event)
???? {
??????????? case EVENT_COMMIT:
?????????????????? GetObjHandleFromActiveXCtrl (panelHandle, PANEL_EDOFFICE, &wordhandle);
?????????????????? GetProjectDir(WordFileName);
?????????????????? strcat(WordFileName,"\\model\\report.docx");
??????????????????
??????????? EDOfficeLib__DEDOfficeOpenWord (wordhandle, NULL, WordFileName, 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_DiscardObjHandle(wordhandle);
?????????????????? break;
???? }
???? return 0;
}
?
int CVICALLBACK Save (int panel, int control, int event,
???????????????????????????????? ? void *callbackData, int eventData1, int eventData2)
{
???? switch (event)
???? {
??????????? case EVENT_COMMIT:
??????????? GetObjHandleFromActiveXCtrl (panelHandle, PANEL_EDOFFICE, &wordhandle);
?????????????????? GetProjectDir(WordFileName);
?????????????????? strcat(WordFileName,"\\model\\report.docx");
?????????????????? EDOfficeLib__DEDOfficeSaveAs (wordhandle, NULL, WordFileName, CA_DEFAULT_VAL, NULL);
?????????????????? CA_DiscardObjHandle(wordhandle);
?????????????????? break;
???? }
???? return 0;
}
? ? ? ? ? EDOfficeLib__DEDOfficeOpenWord函數(shù)用于word文件的打開(kāi),其聲明如下:
HRESULT EDOfficeLib__DEDOfficeOpenWord(CAObjHandle Object_Handle, ERRORINFO *Error_Info,const char *File_Name,VARIANT Confirm_Conversions, VARIANT Read_Only,VARIANT Add_To_Recent_Files,VARIANT Password_Document,VARIANT Password_Template, VARIANT Revert,VARIANT Write_Password_Document,VARIANT Write_Password_Template, VARIANT Format,VBOOL *Return_Value);
? ? ? ? EDOfficeLib__DEDOfficeSaveAs函數(shù)用于office文件的保存,其聲明如下:HRESULT EDOfficeLib__DEDOfficeSaveAs (CAObjHandle Object_Handle,ERRORINFO *Error_Info,const char *File_Path,VARIANT File_Format,VBOOL *Return_Value);
結(jié)論
? ? ? ?由上面的例子可以看出,ActiveX控件類似于LabVIEW和LabWindows/CVI本身的控件,具有獨(dú)立的顯示界面,以及獨(dú)立的屬性、方法甚至事件,在系統(tǒng)中安裝注冊(cè)一個(gè)ActiveX控件后,操作系統(tǒng)中所有應(yīng)用程序都可以使用這個(gè)控件,同時(shí),LabVIEW和LabWindows/CVI語(yǔ)言調(diào)用ActiveX控件的編程也相對(duì)比較簡(jiǎn)單。