目录
最近有项目需要用Labwindows_cvi软件做仪器控制程序,用的时候才知道开发语言是C语言,花了半个多月熟悉Labwindows_cvi软件和C语言语法,勉强满足工作需要。项目中需要创建 Excel文件,对C语言还不是特别熟练,以为用fopen函数就可以创建并使用了,创建完文件打开的时候,提示“无法打开该文件,因为格式或者文件扩展名无效,请确保文件扩展名与文件的格式匹配”。翻阅资料才知道fopen函数能创建的文件格式有.txt、.dat、.csv等。后来问了一下用过Labwindows的同事,他说需要调用Excel库,他也没有用过,让我试试,找到labwindows软件安装路径下的Excel库,打开看见excel各种操作函数都有,直接搞定。
fopen(“D:\\S_试验结果\\test.xlsx”,w+) //这样是不行的
还有一位大神,跟我说都不用创建,直接复制就可以,先在本地新建一个Excel表,然后用C去调DOS复制命令复制一下就可以,这个我没有试,但是应该是可以的。
1.前期准备工作
(1)找到Excel库所在路径
打开Labwindows_cvi软件安装路径,我是安装在D盘,路径是“D:\Program Files (x86)\National Instruments\CVI2013\toolslib\activex\excel”。如图1所示。
图1 excel库文件路径
(2)搭建简单界面
创建一个文本控件和一个按钮控件。如图2所示。
图2 搭建好的界面
(3)添加外部文件(导入Excel库里的文件)
选中项目“CreatExcelFile”,点击鼠标右键,点击“Add Existing file”,如图3所示;找到刚才excel库文件路径,将所有文件选中,点击ok,如图4所示;最终导入的文件如图5所示。
图3 项目中添加外部文件
图4 添加excel库文件
图5 添加完excel库文件后的项目列表
2.开始编程
(1)引入头文件"excelreport.h"和"excel2000.h";如图6所示。
图6 引入头文件
(2)编写实现代码。
#include <cvirte.h>
#include <userint.h>
#include "CreatExcelFile.h"
#include "excelreport.h"
#include "excel2000.h"
static int excelpanel;
int main (int argc, char *argv[])
{
if (InitCVIRTE (0, argv, 0) == 0)
return -1; /* out of memory */
if ((excelpanel = LoadPanel (0, "CreatExcelFile.uir", ExcelPANEL)) < 0)
return -1;
DisplayPanel (excelpanel);
RunUserInterface ();
DiscardPanel (excelpanel);
return 0;
}
int CVICALLBACK ExcelPANEL_callback (int panel, int event, void *callbackData,
int eventData1, int eventData2)
{
switch (event)
{
case EVENT_GOT_FOCUS:
break;
case EVENT_LOST_FOCUS:
break;
case EVENT_CLOSE:
QuitUserInterface (0);
break;
}
return 0;
}
int CVICALLBACK CreatExcelFile_callback (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
//保存路径
char savePath[MAX_PATHNAME_LEN];
//文件保存路径
char fileSavePath[MAX_PATHNAME_LEN];
// excelApp句柄
static CAObjHandle appHandle=0;
// excel工作区间句柄
static CAObjHandle bookHandle=0;
// excel工作区间表格1句柄
static CAObjHandle sheetHandle=0;
// excel工作区间表格1句柄
static CAObjHandle sheetHandle1=0;
switch (event)
{
case EVENT_COMMIT:
//弹出文件夹选择框
if(DirSelectPopupEx ("", "请选择存储文件夹", savePath)<0)
{
return 0;
}
// 将路径显示在界面文本控件
SetCtrlVal (excelpanel, ExcelPANEL_excelFile_path, savePath);
// 获取文本控件路径
GetCtrlVal (excelpanel, ExcelPANEL_excelFile_path, fileSavePath);
// 生成文件保存路径
strcat(fileSavePath, "\\Data.xlsx" );
//如果没有创建应用程序,则创建excel
if(appHandle==0)
{
ExcelRpt_ApplicationNew(0,&appHandle);
}
else //如果已经创建,则首先关闭前一次的book和sheet
{
ExcelRpt_ApplicationQuit(appHandle);
CA_DiscardObjHandle(appHandle);
ExcelRpt_ApplicationNew(0,&appHandle);
}
//新建一个excel文件
ExcelRpt_WorkbookNew(appHandle,&bookHandle);
//获取sheet1句柄
ExcelRpt_GetWorksheetFromName( bookHandle,"Sheet1",&sheetHandle);
//将Sheet1的名称改为amp
ExcelRpt_SetWorksheetAttribute (sheetHandle, ER_WS_ATTR_NAME, "amp");
//在已有的sheet表后面增加一个sheet表格
ExcelRpt_WorksheetNew(bookHandle , -1, &sheetHandle1);
//将新增加的sheet表格名称改为pha
ExcelRpt_SetWorksheetAttribute (sheetHandle1, ER_WS_ATTR_NAME, "pha");
//excel 文件保存
ExcelRpt_WorkbookSave(bookHandle,fileSavePath,ExRConst_DefaultFileFormat );
//将文件设为可见
//ExcelRpt_SetApplicationAttribute (appHandle, ER_AP_ATTR_VISIBLE, 1);
//退出excel文件
ExcelRpt_ApplicationQuit(appHandle);
//释放excel资源
CA_DiscardObjHandle(appHandle);
appHandle=0;
//弹出提示框
MessagePopup("提示", "Excle文件已经创建!");
break;
}
return 0;
}
3.实现效果
运行程序,点击创建excel文件按钮,效果如图7、图8。
图7 程序界面效果
图8 创建完成的Excel表